Components

24 Twig Components
127 Render Count
242 ms Render Time
14.0 MiB Memory Usage

Components

Name Metadata Render Count Render Time
user_avatar
"App\Twig\Components\UserAvatarComponent"
components/user_avatar.html.twig
15 23.93ms
settings_row_switch
"App\Twig\Components\SettingsRowSwitchComponent"
components/_settings_row_switch.html.twig
15 2.00ms
date
"App\Twig\Components\DateComponent"
components/date.html.twig
13 2.17ms
user_inline
"App\Twig\Components\UserInlineComponent"
components/user_inline.html.twig
12 2.27ms
date_edited
"App\Twig\Components\DateEditedComponent"
components/date_edited.html.twig
11 1.09ms
vote
"App\Twig\Components\VoteComponent"
components/vote.html.twig
11 5.99ms
boost
"App\Twig\Components\BoostComponent"
components/boost.html.twig
11 17.94ms
entry_comment
"App\Twig\Components\EntryCommentComponent"
components/entry_comment.html.twig
10 227.74ms
entry_comments_nested
"App\Twig\Components\EntryCommentsNestedComponent"
components/_cached.html.twig
10 152.55ms
user_settings_row_switch
"App\Twig\Components\UserSettingsRowSwitchComponent"
components/_user_settings_row_switch.html.twig
4 0.76ms
settings_row_enum
"App\Twig\Components\SettingsRowEnumComponent"
components/_settings_row_enum.html.twig
2 0.37ms
entry
"App\Twig\Components\EntryComponent"
components/_cached.html.twig
1 11.58ms
entries_cross
"App\Twig\Components\EntriesCrossComponent"
components/_cached.html.twig
1 42.77ms
editor_toolbar
"App\Twig\Components\EditorToolbarComponent"
components/editor_toolbar.html.twig
1 0.24ms
user_actions
"App\Twig\Components\UserActionsComponent"
components/user_actions.html.twig
1 0.45ms
magazine_box
"App\Twig\Components\MagazineBoxComponent"
components/magazine_box.html.twig
1 6.48ms
magazine_sub
"App\Twig\Components\MagazineSubComponent"
components/magazine_sub.html.twig
1 0.43ms
related_magazines
"App\Twig\Components\RelatedMagazinesComponent"
components/_cached.html.twig
1 23.99ms
active_users
"App\Twig\Components\ActiveUsersComponent"
components/_cached.html.twig
1 43.37ms
related_categories
"App\Twig\Components\RelatedCategoriesComponent"
components/_cached.html.twig
1 3.05ms
related_posts
"App\Twig\Components\RelatedPostsComponent"
components/_cached.html.twig
1 4.61ms
related_entries
"App\Twig\Components\RelatedEntriesComponent"
components/_cached.html.twig
1 15.97ms
support_us_block
"App\Twig\Components\SupportUsBlock"
components/_cached.html.twig
1 0.55ms
featured_magazines
"App\Twig\Components\FeaturedMagazinesComponent"
components/_cached.html.twig
1 0.76ms

Render calls

entry App\Twig\Components\EntryComponent 14.0 MiB 11.58 ms
Input props
[
  "entry" => App\Entity\Entry {#2400
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +magazine: App\Entity\Magazine {#262
      +icon: Proxies\__CG__\App\Entity\Image {#242 …}
      +name: "askelectronics@discuss.tchncs.de"
      +title: "askelectronics"
      +description: """
        **For questions about component-level electronic circuits, tools and equipment.**\n
        \n
        Rules\n
        -----\n
        \n
        1: Be nice.\n
        \n
        2: Be on-topic (eg: *Electronic*, not *electrical*).\n
        \n
        3: No commercial stuff, buying, selling or valuations.\n
        \n
        4: Be safe.\n
        \n
        ---
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 154
      +entryCommentCount: 1230
      +postCount: 1
      +postCommentCount: 4
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1729413608 {#270
        date: 2024-10-20 10:40:08.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#233 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
      +entries: Doctrine\ORM\PersistentCollection {#176 …}
      +posts: Doctrine\ORM\PersistentCollection {#134 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
      +bans: Doctrine\ORM\PersistentCollection {#113 …}
      +reports: Doctrine\ORM\PersistentCollection {#99 …}
      +badges: Doctrine\ORM\PersistentCollection {#77 …}
      +logs: Doctrine\ORM\PersistentCollection {#67 …}
      +awards: Doctrine\ORM\PersistentCollection {#2434 …}
      +categories: Doctrine\ORM\PersistentCollection {#1804 …}
      -id: 11
      +apId: "askelectronics@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
      +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
      +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "askelectronics"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727247714 {#268
        date: 2024-09-25 09:01:54.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1687144409 {#276
        date: 2023-06-19 05:13:29.0 +02:00
      }
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
    +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
    +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
    +url: null
    +body: """
      Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
      \n
      That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
      \n
      ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
      \n
      Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
      \n
      I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
      \n
      What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
      \n
      Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
      \n
      I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
      \n
      What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
      \n
      On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
      \n
      Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 10
    +favouriteCount: 14
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1694071771 {#1828
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#1876 …}
    +votes: Doctrine\ORM\PersistentCollection {#1957 …}
    +reports: Doctrine\ORM\PersistentCollection {#1949 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
    +badges: Doctrine\ORM\PersistentCollection {#2166 …}
    +children: []
    -id: 2057
    -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
    -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1693616717
    +visibility: "visible             "
    +apId: "https://voltage.vn/post/18974"
    +editedAt: DateTimeImmutable @1693550651 {#2414
      date: 2023-09-01 08:44:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693550217 {#1570
      date: 2023-09-01 08:36:57.0 +02:00
    }
  }
  "isSingle" => true
  "showShortSentence" => false
  "showBody" => true
]
Attributes
[
  "class" => "entry--single section--top"
]
Component
App\Twig\Components\EntryComponent {#2965
  -authorizationChecker: Symfony\Component\Security\Core\Authorization\AuthorizationChecker {#931 …}
  -newCommentMarkerCount: App\Kbin\NewCommentMarker\NewCommentMarkerCount {#2966 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
  +entry: App\Entity\Entry {#2400
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +magazine: App\Entity\Magazine {#262
      +icon: Proxies\__CG__\App\Entity\Image {#242 …}
      +name: "askelectronics@discuss.tchncs.de"
      +title: "askelectronics"
      +description: """
        **For questions about component-level electronic circuits, tools and equipment.**\n
        \n
        Rules\n
        -----\n
        \n
        1: Be nice.\n
        \n
        2: Be on-topic (eg: *Electronic*, not *electrical*).\n
        \n
        3: No commercial stuff, buying, selling or valuations.\n
        \n
        4: Be safe.\n
        \n
        ---
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 154
      +entryCommentCount: 1230
      +postCount: 1
      +postCommentCount: 4
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1729413608 {#270
        date: 2024-10-20 10:40:08.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#233 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
      +entries: Doctrine\ORM\PersistentCollection {#176 …}
      +posts: Doctrine\ORM\PersistentCollection {#134 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
      +bans: Doctrine\ORM\PersistentCollection {#113 …}
      +reports: Doctrine\ORM\PersistentCollection {#99 …}
      +badges: Doctrine\ORM\PersistentCollection {#77 …}
      +logs: Doctrine\ORM\PersistentCollection {#67 …}
      +awards: Doctrine\ORM\PersistentCollection {#2434 …}
      +categories: Doctrine\ORM\PersistentCollection {#1804 …}
      -id: 11
      +apId: "askelectronics@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
      +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
      +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "askelectronics"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727247714 {#268
        date: 2024-09-25 09:01:54.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1687144409 {#276
        date: 2023-06-19 05:13:29.0 +02:00
      }
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
    +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
    +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
    +url: null
    +body: """
      Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
      \n
      That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
      \n
      ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
      \n
      Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
      \n
      I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
      \n
      What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
      \n
      Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
      \n
      I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
      \n
      What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
      \n
      On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
      \n
      Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 10
    +favouriteCount: 14
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1694071771 {#1828
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#1876 …}
    +votes: Doctrine\ORM\PersistentCollection {#1957 …}
    +reports: Doctrine\ORM\PersistentCollection {#1949 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
    +badges: Doctrine\ORM\PersistentCollection {#2166 …}
    +children: []
    -id: 2057
    -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
    -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1693616717
    +visibility: "visible             "
    +apId: "https://voltage.vn/post/18974"
    +editedAt: DateTimeImmutable @1693550651 {#2414
      date: 2023-09-01 08:44:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693550217 {#1570
      date: 2023-09-01 08:36:57.0 +02:00
    }
  }
  +isSingle: true
  +showShortSentence: false
  +showBody: true
  +showMagazineName: false
  +canSeeTrash: false
  +newComments: 0
}
user_inline App\Twig\Components\UserInlineComponent 14.0 MiB 0.30 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#3164
  +user: Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +showAvatar: false
}
date App\Twig\Components\DateComponent 14.0 MiB 0.41 ms
Input props
[
  "date" => DateTimeImmutable @1693550217 {#1570
    date: 2023-09-01 08:36:57.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#3234
  +date: DateTimeImmutable @1693550217 {#1570
    date: 2023-09-01 08:36:57.0 +02:00
  }
}
date_edited App\Twig\Components\DateEditedComponent 14.0 MiB 0.20 ms
Input props
[
  "createdAt" => DateTimeImmutable @1693550217 {#1570
    date: 2023-09-01 08:36:57.0 +02:00
  }
  "editedAt" => DateTimeImmutable @1693550651 {#2414
    date: 2023-09-01 08:44:11.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateEditedComponent {#3298
  +createdAt: DateTimeImmutable @1693550217 {#1570
    date: 2023-09-01 08:36:57.0 +02:00
  }
  +editedAt: DateTimeImmutable @1693550651 {#2414
    date: 2023-09-01 08:44:11.0 +02:00
  }
}
vote App\Twig\Components\VoteComponent 14.0 MiB 0.71 ms
Input props
[
  "subject" => App\Entity\Entry {#2400
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +magazine: App\Entity\Magazine {#262
      +icon: Proxies\__CG__\App\Entity\Image {#242 …}
      +name: "askelectronics@discuss.tchncs.de"
      +title: "askelectronics"
      +description: """
        **For questions about component-level electronic circuits, tools and equipment.**\n
        \n
        Rules\n
        -----\n
        \n
        1: Be nice.\n
        \n
        2: Be on-topic (eg: *Electronic*, not *electrical*).\n
        \n
        3: No commercial stuff, buying, selling or valuations.\n
        \n
        4: Be safe.\n
        \n
        ---
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 154
      +entryCommentCount: 1230
      +postCount: 1
      +postCommentCount: 4
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1729413608 {#270
        date: 2024-10-20 10:40:08.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#233 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
      +entries: Doctrine\ORM\PersistentCollection {#176 …}
      +posts: Doctrine\ORM\PersistentCollection {#134 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
      +bans: Doctrine\ORM\PersistentCollection {#113 …}
      +reports: Doctrine\ORM\PersistentCollection {#99 …}
      +badges: Doctrine\ORM\PersistentCollection {#77 …}
      +logs: Doctrine\ORM\PersistentCollection {#67 …}
      +awards: Doctrine\ORM\PersistentCollection {#2434 …}
      +categories: Doctrine\ORM\PersistentCollection {#1804 …}
      -id: 11
      +apId: "askelectronics@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
      +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
      +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "askelectronics"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727247714 {#268
        date: 2024-09-25 09:01:54.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1687144409 {#276
        date: 2023-06-19 05:13:29.0 +02:00
      }
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
    +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
    +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
    +url: null
    +body: """
      Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
      \n
      That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
      \n
      ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
      \n
      Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
      \n
      I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
      \n
      What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
      \n
      Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
      \n
      I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
      \n
      What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
      \n
      On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
      \n
      Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 10
    +favouriteCount: 14
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1694071771 {#1828
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#1876 …}
    +votes: Doctrine\ORM\PersistentCollection {#1957 …}
    +reports: Doctrine\ORM\PersistentCollection {#1949 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
    +badges: Doctrine\ORM\PersistentCollection {#2166 …}
    +children: []
    -id: 2057
    -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
    -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1693616717
    +visibility: "visible             "
    +apId: "https://voltage.vn/post/18974"
    +editedAt: DateTimeImmutable @1693550651 {#2414
      date: 2023-09-01 08:44:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693550217 {#1570
      date: 2023-09-01 08:36:57.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\VoteComponent {#3363
  +subject: App\Entity\Entry {#2400
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +magazine: App\Entity\Magazine {#262
      +icon: Proxies\__CG__\App\Entity\Image {#242 …}
      +name: "askelectronics@discuss.tchncs.de"
      +title: "askelectronics"
      +description: """
        **For questions about component-level electronic circuits, tools and equipment.**\n
        \n
        Rules\n
        -----\n
        \n
        1: Be nice.\n
        \n
        2: Be on-topic (eg: *Electronic*, not *electrical*).\n
        \n
        3: No commercial stuff, buying, selling or valuations.\n
        \n
        4: Be safe.\n
        \n
        ---
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 154
      +entryCommentCount: 1230
      +postCount: 1
      +postCommentCount: 4
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1729413608 {#270
        date: 2024-10-20 10:40:08.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#233 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
      +entries: Doctrine\ORM\PersistentCollection {#176 …}
      +posts: Doctrine\ORM\PersistentCollection {#134 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
      +bans: Doctrine\ORM\PersistentCollection {#113 …}
      +reports: Doctrine\ORM\PersistentCollection {#99 …}
      +badges: Doctrine\ORM\PersistentCollection {#77 …}
      +logs: Doctrine\ORM\PersistentCollection {#67 …}
      +awards: Doctrine\ORM\PersistentCollection {#2434 …}
      +categories: Doctrine\ORM\PersistentCollection {#1804 …}
      -id: 11
      +apId: "askelectronics@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
      +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
      +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "askelectronics"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727247714 {#268
        date: 2024-09-25 09:01:54.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1687144409 {#276
        date: 2023-06-19 05:13:29.0 +02:00
      }
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
    +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
    +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
    +url: null
    +body: """
      Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
      \n
      That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
      \n
      ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
      \n
      Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
      \n
      I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
      \n
      What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
      \n
      Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
      \n
      I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
      \n
      What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
      \n
      On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
      \n
      Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 10
    +favouriteCount: 14
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1694071771 {#1828
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#1876 …}
    +votes: Doctrine\ORM\PersistentCollection {#1957 …}
    +reports: Doctrine\ORM\PersistentCollection {#1949 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
    +badges: Doctrine\ORM\PersistentCollection {#2166 …}
    +children: []
    -id: 2057
    -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
    -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1693616717
    +visibility: "visible             "
    +apId: "https://voltage.vn/post/18974"
    +editedAt: DateTimeImmutable @1693550651 {#2414
      date: 2023-09-01 08:44:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693550217 {#1570
      date: 2023-09-01 08:36:57.0 +02:00
    }
  }
  +formDest: "entry"
  +showDownvote: true
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
boost App\Twig\Components\BoostComponent 14.0 MiB 1.02 ms
Input props
[
  "subject" => App\Entity\Entry {#2400
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +magazine: App\Entity\Magazine {#262
      +icon: Proxies\__CG__\App\Entity\Image {#242 …}
      +name: "askelectronics@discuss.tchncs.de"
      +title: "askelectronics"
      +description: """
        **For questions about component-level electronic circuits, tools and equipment.**\n
        \n
        Rules\n
        -----\n
        \n
        1: Be nice.\n
        \n
        2: Be on-topic (eg: *Electronic*, not *electrical*).\n
        \n
        3: No commercial stuff, buying, selling or valuations.\n
        \n
        4: Be safe.\n
        \n
        ---
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 154
      +entryCommentCount: 1230
      +postCount: 1
      +postCommentCount: 4
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1729413608 {#270
        date: 2024-10-20 10:40:08.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#233 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
      +entries: Doctrine\ORM\PersistentCollection {#176 …}
      +posts: Doctrine\ORM\PersistentCollection {#134 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
      +bans: Doctrine\ORM\PersistentCollection {#113 …}
      +reports: Doctrine\ORM\PersistentCollection {#99 …}
      +badges: Doctrine\ORM\PersistentCollection {#77 …}
      +logs: Doctrine\ORM\PersistentCollection {#67 …}
      +awards: Doctrine\ORM\PersistentCollection {#2434 …}
      +categories: Doctrine\ORM\PersistentCollection {#1804 …}
      -id: 11
      +apId: "askelectronics@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
      +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
      +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "askelectronics"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727247714 {#268
        date: 2024-09-25 09:01:54.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1687144409 {#276
        date: 2023-06-19 05:13:29.0 +02:00
      }
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
    +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
    +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
    +url: null
    +body: """
      Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
      \n
      That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
      \n
      ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
      \n
      Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
      \n
      I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
      \n
      What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
      \n
      Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
      \n
      I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
      \n
      What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
      \n
      On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
      \n
      Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 10
    +favouriteCount: 14
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1694071771 {#1828
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#1876 …}
    +votes: Doctrine\ORM\PersistentCollection {#1957 …}
    +reports: Doctrine\ORM\PersistentCollection {#1949 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
    +badges: Doctrine\ORM\PersistentCollection {#2166 …}
    +children: []
    -id: 2057
    -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
    -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1693616717
    +visibility: "visible             "
    +apId: "https://voltage.vn/post/18974"
    +editedAt: DateTimeImmutable @1693550651 {#2414
      date: 2023-09-01 08:44:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693550217 {#1570
      date: 2023-09-01 08:36:57.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\BoostComponent {#3429
  +formDest: "entry"
  +subject: App\Entity\Entry {#2400
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +magazine: App\Entity\Magazine {#262
      +icon: Proxies\__CG__\App\Entity\Image {#242 …}
      +name: "askelectronics@discuss.tchncs.de"
      +title: "askelectronics"
      +description: """
        **For questions about component-level electronic circuits, tools and equipment.**\n
        \n
        Rules\n
        -----\n
        \n
        1: Be nice.\n
        \n
        2: Be on-topic (eg: *Electronic*, not *electrical*).\n
        \n
        3: No commercial stuff, buying, selling or valuations.\n
        \n
        4: Be safe.\n
        \n
        ---
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 154
      +entryCommentCount: 1230
      +postCount: 1
      +postCommentCount: 4
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1729413608 {#270
        date: 2024-10-20 10:40:08.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#233 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
      +entries: Doctrine\ORM\PersistentCollection {#176 …}
      +posts: Doctrine\ORM\PersistentCollection {#134 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
      +bans: Doctrine\ORM\PersistentCollection {#113 …}
      +reports: Doctrine\ORM\PersistentCollection {#99 …}
      +badges: Doctrine\ORM\PersistentCollection {#77 …}
      +logs: Doctrine\ORM\PersistentCollection {#67 …}
      +awards: Doctrine\ORM\PersistentCollection {#2434 …}
      +categories: Doctrine\ORM\PersistentCollection {#1804 …}
      -id: 11
      +apId: "askelectronics@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
      +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
      +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "askelectronics"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727247714 {#268
        date: 2024-09-25 09:01:54.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1687144409 {#276
        date: 2023-06-19 05:13:29.0 +02:00
      }
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
    +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
    +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
    +url: null
    +body: """
      Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
      \n
      That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
      \n
      ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
      \n
      Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
      \n
      I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
      \n
      What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
      \n
      Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
      \n
      I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
      \n
      What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
      \n
      On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
      \n
      Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 10
    +favouriteCount: 14
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1694071771 {#1828
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#1876 …}
    +votes: Doctrine\ORM\PersistentCollection {#1957 …}
    +reports: Doctrine\ORM\PersistentCollection {#1949 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
    +badges: Doctrine\ORM\PersistentCollection {#2166 …}
    +children: []
    -id: 2057
    -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
    -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1693616717
    +visibility: "visible             "
    +apId: "https://voltage.vn/post/18974"
    +editedAt: DateTimeImmutable @1693550651 {#2414
      date: 2023-09-01 08:44:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693550217 {#1570
      date: 2023-09-01 08:36:57.0 +02:00
    }
  }
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
entries_cross App\Twig\Components\EntriesCrossComponent 14.0 MiB 42.77 ms
Input props
[
  "entry" => App\Entity\Entry {#2400
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +magazine: App\Entity\Magazine {#262
      +icon: Proxies\__CG__\App\Entity\Image {#242 …}
      +name: "askelectronics@discuss.tchncs.de"
      +title: "askelectronics"
      +description: """
        **For questions about component-level electronic circuits, tools and equipment.**\n
        \n
        Rules\n
        -----\n
        \n
        1: Be nice.\n
        \n
        2: Be on-topic (eg: *Electronic*, not *electrical*).\n
        \n
        3: No commercial stuff, buying, selling or valuations.\n
        \n
        4: Be safe.\n
        \n
        ---
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 154
      +entryCommentCount: 1230
      +postCount: 1
      +postCommentCount: 4
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1729413608 {#270
        date: 2024-10-20 10:40:08.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#233 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
      +entries: Doctrine\ORM\PersistentCollection {#176 …}
      +posts: Doctrine\ORM\PersistentCollection {#134 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
      +bans: Doctrine\ORM\PersistentCollection {#113 …}
      +reports: Doctrine\ORM\PersistentCollection {#99 …}
      +badges: Doctrine\ORM\PersistentCollection {#77 …}
      +logs: Doctrine\ORM\PersistentCollection {#67 …}
      +awards: Doctrine\ORM\PersistentCollection {#2434 …}
      +categories: Doctrine\ORM\PersistentCollection {#1804 …}
      -id: 11
      +apId: "askelectronics@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
      +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
      +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "askelectronics"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727247714 {#268
        date: 2024-09-25 09:01:54.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1687144409 {#276
        date: 2023-06-19 05:13:29.0 +02:00
      }
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
    +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
    +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
    +url: null
    +body: """
      Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
      \n
      That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
      \n
      ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
      \n
      Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
      \n
      I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
      \n
      What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
      \n
      Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
      \n
      I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
      \n
      What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
      \n
      On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
      \n
      Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 10
    +favouriteCount: 14
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1694071771 {#1828
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#1876 …}
    +votes: Doctrine\ORM\PersistentCollection {#1957 …}
    +reports: Doctrine\ORM\PersistentCollection {#1949 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
    +badges: Doctrine\ORM\PersistentCollection {#2166 …}
    +children: []
    -id: 2057
    -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
    -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1693616717
    +visibility: "visible             "
    +apId: "https://voltage.vn/post/18974"
    +editedAt: DateTimeImmutable @1693550651 {#2414
      date: 2023-09-01 08:44:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693550217 {#1570
      date: 2023-09-01 08:36:57.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\EntriesCrossComponent {#3743
  +entry: App\Entity\Entry {#2400
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +magazine: App\Entity\Magazine {#262
      +icon: Proxies\__CG__\App\Entity\Image {#242 …}
      +name: "askelectronics@discuss.tchncs.de"
      +title: "askelectronics"
      +description: """
        **For questions about component-level electronic circuits, tools and equipment.**\n
        \n
        Rules\n
        -----\n
        \n
        1: Be nice.\n
        \n
        2: Be on-topic (eg: *Electronic*, not *electrical*).\n
        \n
        3: No commercial stuff, buying, selling or valuations.\n
        \n
        4: Be safe.\n
        \n
        ---
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 154
      +entryCommentCount: 1230
      +postCount: 1
      +postCommentCount: 4
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1729413608 {#270
        date: 2024-10-20 10:40:08.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#233 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
      +entries: Doctrine\ORM\PersistentCollection {#176 …}
      +posts: Doctrine\ORM\PersistentCollection {#134 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
      +bans: Doctrine\ORM\PersistentCollection {#113 …}
      +reports: Doctrine\ORM\PersistentCollection {#99 …}
      +badges: Doctrine\ORM\PersistentCollection {#77 …}
      +logs: Doctrine\ORM\PersistentCollection {#67 …}
      +awards: Doctrine\ORM\PersistentCollection {#2434 …}
      +categories: Doctrine\ORM\PersistentCollection {#1804 …}
      -id: 11
      +apId: "askelectronics@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
      +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
      +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "askelectronics"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727247714 {#268
        date: 2024-09-25 09:01:54.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1687144409 {#276
        date: 2023-06-19 05:13:29.0 +02:00
      }
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
    +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
    +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
    +url: null
    +body: """
      Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
      \n
      That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
      \n
      ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
      \n
      Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
      \n
      I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
      \n
      What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
      \n
      Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
      \n
      I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
      \n
      What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
      \n
      On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
      \n
      Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 10
    +favouriteCount: 14
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1694071771 {#1828
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#1876 …}
    +votes: Doctrine\ORM\PersistentCollection {#1957 …}
    +reports: Doctrine\ORM\PersistentCollection {#1949 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
    +badges: Doctrine\ORM\PersistentCollection {#2166 …}
    +children: []
    -id: 2057
    -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
    -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1693616717
    +visibility: "visible             "
    +apId: "https://voltage.vn/post/18974"
    +editedAt: DateTimeImmutable @1693550651 {#2414
      date: 2023-09-01 08:44:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693550217 {#1570
      date: 2023-09-01 08:36:57.0 +02:00
    }
  }
  -repository: App\Repository\EntryRepository {#335 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
}
editor_toolbar App\Twig\Components\EditorToolbarComponent 14.0 MiB 0.24 ms
Input props
[
  "id" => "entry_comment_67bccee25fa589.12284515_body"
]
Attributes
[]
Component
App\Twig\Components\EditorToolbarComponent {#3868
  +id: "entry_comment_67bccee25fa589.12284515_body"
}
entry_comment App\Twig\Components\EntryCommentComponent 14.0 MiB 16.44 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4068
    +user: App\Entity\User {#4016
      +avatar: null
      +cover: null
      +email: "BlueAure@infosec.pub"
      +username: "@BlueAure@infosec.pub"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1705400206 {#4076
        date: 2024-01-16 11:16:46.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: false
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: true
      +notifyOnNewEntryCommentReply: true
      +notifyOnNewPost: false
      +notifyOnNewPostReply: true
      +notifyOnNewPostCommentReply: true
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
      +entries: Doctrine\ORM\PersistentCollection {#4010 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
      +posts: Doctrine\ORM\PersistentCollection {#4000 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
      +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
      +follows: Doctrine\ORM\PersistentCollection {#4132 …}
      +followers: Doctrine\ORM\PersistentCollection {#4128 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
      +reports: Doctrine\ORM\PersistentCollection {#4131 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
      +violations: Doctrine\ORM\PersistentCollection {#4121 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
      +awards: Doctrine\ORM\PersistentCollection {#4122 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
      +categories: Doctrine\ORM\PersistentCollection {#4119 …}
      -id: 44380
      -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
      +apId: "BlueAure@infosec.pub"
      +apProfileId: "https://infosec.pub/u/BlueAure"
      +apPublicUrl: "https://infosec.pub/u/BlueAure"
      +apFollowersUrl: null
      +apInboxUrl: "https://infosec.pub/inbox"
      +apDomain: "infosec.pub"
      +apPreferredUsername: "BlueAure"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727801513 {#4072
        date: 2024-10-01 18:51:53.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1693625490 {#4070
        date: 2023-09-02 05:31:30.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905135 {#4077
      date: 2023-09-05 11:12:15.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4066 …}
    +nested: Doctrine\ORM\PersistentCollection {#4064 …}
    +votes: Doctrine\ORM\PersistentCollection {#4062 …}
    +reports: Doctrine\ORM\PersistentCollection {#4060 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
    -id: 27754
    -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://infosec.pub/comment/2295613"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693625485 {#4013
      date: 2023-09-02 05:31:25.0 +02:00
    }
  }
  "showNested" => true
  "dateAsUrl" => false
  "showMagazineName" => false
  "showEntryTitle" => false
]
Attributes
[]
Component
App\Twig\Components\EntryCommentComponent {#4317
  +comment: App\Entity\EntryComment {#4068
    +user: App\Entity\User {#4016
      +avatar: null
      +cover: null
      +email: "BlueAure@infosec.pub"
      +username: "@BlueAure@infosec.pub"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1705400206 {#4076
        date: 2024-01-16 11:16:46.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: false
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: true
      +notifyOnNewEntryCommentReply: true
      +notifyOnNewPost: false
      +notifyOnNewPostReply: true
      +notifyOnNewPostCommentReply: true
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
      +entries: Doctrine\ORM\PersistentCollection {#4010 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
      +posts: Doctrine\ORM\PersistentCollection {#4000 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
      +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
      +follows: Doctrine\ORM\PersistentCollection {#4132 …}
      +followers: Doctrine\ORM\PersistentCollection {#4128 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
      +reports: Doctrine\ORM\PersistentCollection {#4131 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
      +violations: Doctrine\ORM\PersistentCollection {#4121 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
      +awards: Doctrine\ORM\PersistentCollection {#4122 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
      +categories: Doctrine\ORM\PersistentCollection {#4119 …}
      -id: 44380
      -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
      +apId: "BlueAure@infosec.pub"
      +apProfileId: "https://infosec.pub/u/BlueAure"
      +apPublicUrl: "https://infosec.pub/u/BlueAure"
      +apFollowersUrl: null
      +apInboxUrl: "https://infosec.pub/inbox"
      +apDomain: "infosec.pub"
      +apPreferredUsername: "BlueAure"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727801513 {#4072
        date: 2024-10-01 18:51:53.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1693625490 {#4070
        date: 2023-09-02 05:31:30.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905135 {#4077
      date: 2023-09-05 11:12:15.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4066 …}
    +nested: Doctrine\ORM\PersistentCollection {#4064 …}
    +votes: Doctrine\ORM\PersistentCollection {#4062 …}
    +reports: Doctrine\ORM\PersistentCollection {#4060 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
    -id: 27754
    -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://infosec.pub/comment/2295613"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693625485 {#4013
      date: 2023-09-02 05:31:25.0 +02:00
    }
  }
  +showMagazineName: false
  +showEntryTitle: false
  +showNested: true
  +level: 1
  +canSeeTrash: false
  +dateAsUrl: false
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -authorizationChecker: Symfony\Component\Security\Core\Authorization\AuthorizationChecker {#931 …}
}
user_inline App\Twig\Components\UserInlineComponent 14.0 MiB 0.19 ms
Input props
[
  "user" => App\Entity\User {#4016
    +avatar: null
    +cover: null
    +email: "BlueAure@infosec.pub"
    +username: "@BlueAure@infosec.pub"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1705400206 {#4076
      date: 2024-01-16 11:16:46.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: false
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: true
    +notifyOnNewEntryCommentReply: true
    +notifyOnNewPost: false
    +notifyOnNewPostReply: true
    +notifyOnNewPostCommentReply: true
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
    +entries: Doctrine\ORM\PersistentCollection {#4010 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
    +posts: Doctrine\ORM\PersistentCollection {#4000 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
    +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
    +follows: Doctrine\ORM\PersistentCollection {#4132 …}
    +followers: Doctrine\ORM\PersistentCollection {#4128 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
    +reports: Doctrine\ORM\PersistentCollection {#4131 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
    +violations: Doctrine\ORM\PersistentCollection {#4121 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
    +awards: Doctrine\ORM\PersistentCollection {#4122 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
    +categories: Doctrine\ORM\PersistentCollection {#4119 …}
    -id: 44380
    -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
    +apId: "BlueAure@infosec.pub"
    +apProfileId: "https://infosec.pub/u/BlueAure"
    +apPublicUrl: "https://infosec.pub/u/BlueAure"
    +apFollowersUrl: null
    +apInboxUrl: "https://infosec.pub/inbox"
    +apDomain: "infosec.pub"
    +apPreferredUsername: "BlueAure"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1727801513 {#4072
      date: 2024-10-01 18:51:53.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1693625490 {#4070
      date: 2023-09-02 05:31:30.0 +02:00
    }
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#4452
  +user: App\Entity\User {#4016
    +avatar: null
    +cover: null
    +email: "BlueAure@infosec.pub"
    +username: "@BlueAure@infosec.pub"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1705400206 {#4076
      date: 2024-01-16 11:16:46.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: false
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: true
    +notifyOnNewEntryCommentReply: true
    +notifyOnNewPost: false
    +notifyOnNewPostReply: true
    +notifyOnNewPostCommentReply: true
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
    +entries: Doctrine\ORM\PersistentCollection {#4010 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
    +posts: Doctrine\ORM\PersistentCollection {#4000 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
    +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
    +follows: Doctrine\ORM\PersistentCollection {#4132 …}
    +followers: Doctrine\ORM\PersistentCollection {#4128 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
    +reports: Doctrine\ORM\PersistentCollection {#4131 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
    +violations: Doctrine\ORM\PersistentCollection {#4121 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
    +awards: Doctrine\ORM\PersistentCollection {#4122 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
    +categories: Doctrine\ORM\PersistentCollection {#4119 …}
    -id: 44380
    -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
    +apId: "BlueAure@infosec.pub"
    +apProfileId: "https://infosec.pub/u/BlueAure"
    +apPublicUrl: "https://infosec.pub/u/BlueAure"
    +apFollowersUrl: null
    +apInboxUrl: "https://infosec.pub/inbox"
    +apDomain: "infosec.pub"
    +apPreferredUsername: "BlueAure"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1727801513 {#4072
      date: 2024-10-01 18:51:53.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1693625490 {#4070
      date: 2023-09-02 05:31:30.0 +02:00
    }
  }
  +showAvatar: false
}
date App\Twig\Components\DateComponent 14.0 MiB 0.14 ms
Input props
[
  "date" => DateTimeImmutable @1693625485 {#4013
    date: 2023-09-02 05:31:25.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#4507
  +date: DateTimeImmutable @1693625485 {#4013
    date: 2023-09-02 05:31:25.0 +02:00
  }
}
date_edited App\Twig\Components\DateEditedComponent 14.0 MiB 0.09 ms
Input props
[
  "createdAt" => DateTimeImmutable @1693625485 {#4013
    date: 2023-09-02 05:31:25.0 +02:00
  }
  "editedAt" => null
]
Attributes
[]
Component
App\Twig\Components\DateEditedComponent {#4561
  +createdAt: DateTimeImmutable @1693625485 {#4013
    date: 2023-09-02 05:31:25.0 +02:00
  }
  +editedAt: null
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 0.22 ms
Input props
[
  "user" => App\Entity\User {#4016
    +avatar: null
    +cover: null
    +email: "BlueAure@infosec.pub"
    +username: "@BlueAure@infosec.pub"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1705400206 {#4076
      date: 2024-01-16 11:16:46.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: false
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: true
    +notifyOnNewEntryCommentReply: true
    +notifyOnNewPost: false
    +notifyOnNewPostReply: true
    +notifyOnNewPostCommentReply: true
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
    +entries: Doctrine\ORM\PersistentCollection {#4010 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
    +posts: Doctrine\ORM\PersistentCollection {#4000 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
    +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
    +follows: Doctrine\ORM\PersistentCollection {#4132 …}
    +followers: Doctrine\ORM\PersistentCollection {#4128 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
    +reports: Doctrine\ORM\PersistentCollection {#4131 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
    +violations: Doctrine\ORM\PersistentCollection {#4121 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
    +awards: Doctrine\ORM\PersistentCollection {#4122 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
    +categories: Doctrine\ORM\PersistentCollection {#4119 …}
    -id: 44380
    -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
    +apId: "BlueAure@infosec.pub"
    +apProfileId: "https://infosec.pub/u/BlueAure"
    +apPublicUrl: "https://infosec.pub/u/BlueAure"
    +apFollowersUrl: null
    +apInboxUrl: "https://infosec.pub/inbox"
    +apDomain: "infosec.pub"
    +apPreferredUsername: "BlueAure"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1727801513 {#4072
      date: 2024-10-01 18:51:53.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1693625490 {#4070
      date: 2023-09-02 05:31:30.0 +02:00
    }
  }
  "width" => 40
  "height" => 40
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#4617
  +width: 40
  +height: 40
  +user: App\Entity\User {#4016
    +avatar: null
    +cover: null
    +email: "BlueAure@infosec.pub"
    +username: "@BlueAure@infosec.pub"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1705400206 {#4076
      date: 2024-01-16 11:16:46.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: false
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: true
    +notifyOnNewEntryCommentReply: true
    +notifyOnNewPost: false
    +notifyOnNewPostReply: true
    +notifyOnNewPostCommentReply: true
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
    +entries: Doctrine\ORM\PersistentCollection {#4010 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
    +posts: Doctrine\ORM\PersistentCollection {#4000 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
    +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
    +follows: Doctrine\ORM\PersistentCollection {#4132 …}
    +followers: Doctrine\ORM\PersistentCollection {#4128 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
    +reports: Doctrine\ORM\PersistentCollection {#4131 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
    +violations: Doctrine\ORM\PersistentCollection {#4121 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
    +awards: Doctrine\ORM\PersistentCollection {#4122 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
    +categories: Doctrine\ORM\PersistentCollection {#4119 …}
    -id: 44380
    -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
    +apId: "BlueAure@infosec.pub"
    +apProfileId: "https://infosec.pub/u/BlueAure"
    +apPublicUrl: "https://infosec.pub/u/BlueAure"
    +apFollowersUrl: null
    +apInboxUrl: "https://infosec.pub/inbox"
    +apDomain: "infosec.pub"
    +apPreferredUsername: "BlueAure"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1727801513 {#4072
      date: 2024-10-01 18:51:53.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1693625490 {#4070
      date: 2023-09-02 05:31:30.0 +02:00
    }
  }
  +asLink: true
}
vote App\Twig\Components\VoteComponent 14.0 MiB 0.34 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4068
    +user: App\Entity\User {#4016
      +avatar: null
      +cover: null
      +email: "BlueAure@infosec.pub"
      +username: "@BlueAure@infosec.pub"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1705400206 {#4076
        date: 2024-01-16 11:16:46.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: false
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: true
      +notifyOnNewEntryCommentReply: true
      +notifyOnNewPost: false
      +notifyOnNewPostReply: true
      +notifyOnNewPostCommentReply: true
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
      +entries: Doctrine\ORM\PersistentCollection {#4010 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
      +posts: Doctrine\ORM\PersistentCollection {#4000 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
      +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
      +follows: Doctrine\ORM\PersistentCollection {#4132 …}
      +followers: Doctrine\ORM\PersistentCollection {#4128 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
      +reports: Doctrine\ORM\PersistentCollection {#4131 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
      +violations: Doctrine\ORM\PersistentCollection {#4121 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
      +awards: Doctrine\ORM\PersistentCollection {#4122 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
      +categories: Doctrine\ORM\PersistentCollection {#4119 …}
      -id: 44380
      -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
      +apId: "BlueAure@infosec.pub"
      +apProfileId: "https://infosec.pub/u/BlueAure"
      +apPublicUrl: "https://infosec.pub/u/BlueAure"
      +apFollowersUrl: null
      +apInboxUrl: "https://infosec.pub/inbox"
      +apDomain: "infosec.pub"
      +apPreferredUsername: "BlueAure"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727801513 {#4072
        date: 2024-10-01 18:51:53.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1693625490 {#4070
        date: 2023-09-02 05:31:30.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905135 {#4077
      date: 2023-09-05 11:12:15.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4066 …}
    +nested: Doctrine\ORM\PersistentCollection {#4064 …}
    +votes: Doctrine\ORM\PersistentCollection {#4062 …}
    +reports: Doctrine\ORM\PersistentCollection {#4060 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
    -id: 27754
    -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://infosec.pub/comment/2295613"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693625485 {#4013
      date: 2023-09-02 05:31:25.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\VoteComponent {#4700
  +subject: App\Entity\EntryComment {#4068
    +user: App\Entity\User {#4016
      +avatar: null
      +cover: null
      +email: "BlueAure@infosec.pub"
      +username: "@BlueAure@infosec.pub"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1705400206 {#4076
        date: 2024-01-16 11:16:46.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: false
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: true
      +notifyOnNewEntryCommentReply: true
      +notifyOnNewPost: false
      +notifyOnNewPostReply: true
      +notifyOnNewPostCommentReply: true
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
      +entries: Doctrine\ORM\PersistentCollection {#4010 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
      +posts: Doctrine\ORM\PersistentCollection {#4000 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
      +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
      +follows: Doctrine\ORM\PersistentCollection {#4132 …}
      +followers: Doctrine\ORM\PersistentCollection {#4128 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
      +reports: Doctrine\ORM\PersistentCollection {#4131 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
      +violations: Doctrine\ORM\PersistentCollection {#4121 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
      +awards: Doctrine\ORM\PersistentCollection {#4122 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
      +categories: Doctrine\ORM\PersistentCollection {#4119 …}
      -id: 44380
      -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
      +apId: "BlueAure@infosec.pub"
      +apProfileId: "https://infosec.pub/u/BlueAure"
      +apPublicUrl: "https://infosec.pub/u/BlueAure"
      +apFollowersUrl: null
      +apInboxUrl: "https://infosec.pub/inbox"
      +apDomain: "infosec.pub"
      +apPreferredUsername: "BlueAure"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727801513 {#4072
        date: 2024-10-01 18:51:53.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1693625490 {#4070
        date: 2023-09-02 05:31:30.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905135 {#4077
      date: 2023-09-05 11:12:15.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4066 …}
    +nested: Doctrine\ORM\PersistentCollection {#4064 …}
    +votes: Doctrine\ORM\PersistentCollection {#4062 …}
    +reports: Doctrine\ORM\PersistentCollection {#4060 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
    -id: 27754
    -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://infosec.pub/comment/2295613"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693625485 {#4013
      date: 2023-09-02 05:31:25.0 +02:00
    }
  }
  +formDest: "entry_comment"
  +showDownvote: true
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
boost App\Twig\Components\BoostComponent 14.0 MiB 0.96 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4068
    +user: App\Entity\User {#4016
      +avatar: null
      +cover: null
      +email: "BlueAure@infosec.pub"
      +username: "@BlueAure@infosec.pub"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1705400206 {#4076
        date: 2024-01-16 11:16:46.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: false
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: true
      +notifyOnNewEntryCommentReply: true
      +notifyOnNewPost: false
      +notifyOnNewPostReply: true
      +notifyOnNewPostCommentReply: true
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
      +entries: Doctrine\ORM\PersistentCollection {#4010 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
      +posts: Doctrine\ORM\PersistentCollection {#4000 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
      +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
      +follows: Doctrine\ORM\PersistentCollection {#4132 …}
      +followers: Doctrine\ORM\PersistentCollection {#4128 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
      +reports: Doctrine\ORM\PersistentCollection {#4131 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
      +violations: Doctrine\ORM\PersistentCollection {#4121 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
      +awards: Doctrine\ORM\PersistentCollection {#4122 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
      +categories: Doctrine\ORM\PersistentCollection {#4119 …}
      -id: 44380
      -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
      +apId: "BlueAure@infosec.pub"
      +apProfileId: "https://infosec.pub/u/BlueAure"
      +apPublicUrl: "https://infosec.pub/u/BlueAure"
      +apFollowersUrl: null
      +apInboxUrl: "https://infosec.pub/inbox"
      +apDomain: "infosec.pub"
      +apPreferredUsername: "BlueAure"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727801513 {#4072
        date: 2024-10-01 18:51:53.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1693625490 {#4070
        date: 2023-09-02 05:31:30.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905135 {#4077
      date: 2023-09-05 11:12:15.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4066 …}
    +nested: Doctrine\ORM\PersistentCollection {#4064 …}
    +votes: Doctrine\ORM\PersistentCollection {#4062 …}
    +reports: Doctrine\ORM\PersistentCollection {#4060 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
    -id: 27754
    -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://infosec.pub/comment/2295613"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693625485 {#4013
      date: 2023-09-02 05:31:25.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\BoostComponent {#4757
  +formDest: "entry_comment"
  +subject: App\Entity\EntryComment {#4068
    +user: App\Entity\User {#4016
      +avatar: null
      +cover: null
      +email: "BlueAure@infosec.pub"
      +username: "@BlueAure@infosec.pub"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1705400206 {#4076
        date: 2024-01-16 11:16:46.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: false
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: true
      +notifyOnNewEntryCommentReply: true
      +notifyOnNewPost: false
      +notifyOnNewPostReply: true
      +notifyOnNewPostCommentReply: true
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
      +entries: Doctrine\ORM\PersistentCollection {#4010 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
      +posts: Doctrine\ORM\PersistentCollection {#4000 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
      +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
      +follows: Doctrine\ORM\PersistentCollection {#4132 …}
      +followers: Doctrine\ORM\PersistentCollection {#4128 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
      +reports: Doctrine\ORM\PersistentCollection {#4131 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
      +violations: Doctrine\ORM\PersistentCollection {#4121 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
      +awards: Doctrine\ORM\PersistentCollection {#4122 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
      +categories: Doctrine\ORM\PersistentCollection {#4119 …}
      -id: 44380
      -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
      +apId: "BlueAure@infosec.pub"
      +apProfileId: "https://infosec.pub/u/BlueAure"
      +apPublicUrl: "https://infosec.pub/u/BlueAure"
      +apFollowersUrl: null
      +apInboxUrl: "https://infosec.pub/inbox"
      +apDomain: "infosec.pub"
      +apPreferredUsername: "BlueAure"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727801513 {#4072
        date: 2024-10-01 18:51:53.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1693625490 {#4070
        date: 2023-09-02 05:31:30.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905135 {#4077
      date: 2023-09-05 11:12:15.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4066 …}
    +nested: Doctrine\ORM\PersistentCollection {#4064 …}
    +votes: Doctrine\ORM\PersistentCollection {#4062 …}
    +reports: Doctrine\ORM\PersistentCollection {#4060 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
    -id: 27754
    -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://infosec.pub/comment/2295613"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693625485 {#4013
      date: 2023-09-02 05:31:25.0 +02:00
    }
  }
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
entry_comments_nested App\Twig\Components\EntryCommentsNestedComponent 14.0 MiB 7.91 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4068
    +user: App\Entity\User {#4016
      +avatar: null
      +cover: null
      +email: "BlueAure@infosec.pub"
      +username: "@BlueAure@infosec.pub"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1705400206 {#4076
        date: 2024-01-16 11:16:46.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: false
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: true
      +notifyOnNewEntryCommentReply: true
      +notifyOnNewPost: false
      +notifyOnNewPostReply: true
      +notifyOnNewPostCommentReply: true
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
      +entries: Doctrine\ORM\PersistentCollection {#4010 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
      +posts: Doctrine\ORM\PersistentCollection {#4000 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
      +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
      +follows: Doctrine\ORM\PersistentCollection {#4132 …}
      +followers: Doctrine\ORM\PersistentCollection {#4128 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
      +reports: Doctrine\ORM\PersistentCollection {#4131 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
      +violations: Doctrine\ORM\PersistentCollection {#4121 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
      +awards: Doctrine\ORM\PersistentCollection {#4122 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
      +categories: Doctrine\ORM\PersistentCollection {#4119 …}
      -id: 44380
      -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
      +apId: "BlueAure@infosec.pub"
      +apProfileId: "https://infosec.pub/u/BlueAure"
      +apPublicUrl: "https://infosec.pub/u/BlueAure"
      +apFollowersUrl: null
      +apInboxUrl: "https://infosec.pub/inbox"
      +apDomain: "infosec.pub"
      +apPreferredUsername: "BlueAure"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727801513 {#4072
        date: 2024-10-01 18:51:53.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1693625490 {#4070
        date: 2023-09-02 05:31:30.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905135 {#4077
      date: 2023-09-05 11:12:15.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4066 …}
    +nested: Doctrine\ORM\PersistentCollection {#4064 …}
    +votes: Doctrine\ORM\PersistentCollection {#4062 …}
    +reports: Doctrine\ORM\PersistentCollection {#4060 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
    -id: 27754
    -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://infosec.pub/comment/2295613"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693625485 {#4013
      date: 2023-09-02 05:31:25.0 +02:00
    }
  }
  "level" => 1
  "showNested" => true
  "view" => "tree"
]
Attributes
[
  "showNested" => true
]
Component
App\Twig\Components\EntryCommentsNestedComponent {#5004
  +comment: App\Entity\EntryComment {#4068
    +user: App\Entity\User {#4016
      +avatar: null
      +cover: null
      +email: "BlueAure@infosec.pub"
      +username: "@BlueAure@infosec.pub"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1705400206 {#4076
        date: 2024-01-16 11:16:46.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: false
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: true
      +notifyOnNewEntryCommentReply: true
      +notifyOnNewPost: false
      +notifyOnNewPostReply: true
      +notifyOnNewPostCommentReply: true
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
      +entries: Doctrine\ORM\PersistentCollection {#4010 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
      +posts: Doctrine\ORM\PersistentCollection {#4000 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
      +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
      +follows: Doctrine\ORM\PersistentCollection {#4132 …}
      +followers: Doctrine\ORM\PersistentCollection {#4128 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
      +reports: Doctrine\ORM\PersistentCollection {#4131 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
      +violations: Doctrine\ORM\PersistentCollection {#4121 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
      +awards: Doctrine\ORM\PersistentCollection {#4122 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
      +categories: Doctrine\ORM\PersistentCollection {#4119 …}
      -id: 44380
      -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
      +apId: "BlueAure@infosec.pub"
      +apProfileId: "https://infosec.pub/u/BlueAure"
      +apPublicUrl: "https://infosec.pub/u/BlueAure"
      +apFollowersUrl: null
      +apInboxUrl: "https://infosec.pub/inbox"
      +apDomain: "infosec.pub"
      +apPreferredUsername: "BlueAure"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1727801513 {#4072
        date: 2024-10-01 18:51:53.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1693625490 {#4070
        date: 2023-09-02 05:31:30.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905135 {#4077
      date: 2023-09-05 11:12:15.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4066 …}
    +nested: Doctrine\ORM\PersistentCollection {#4064 …}
    +votes: Doctrine\ORM\PersistentCollection {#4062 …}
    +reports: Doctrine\ORM\PersistentCollection {#4060 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
    -id: 27754
    -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://infosec.pub/comment/2295613"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693625485 {#4013
      date: 2023-09-02 05:31:25.0 +02:00
    }
  }
  +nestedComments: [
    28062 => App\Entity\EntryComment {#4299
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4068}
      +root: App\Entity\EntryComment {#4068}
      +body: """
        Ok yeah – I’m leaning toward relying more on the laser ToF than the rotary encoders.\n
        \n
        A simple algorithm of ‘pick a lidar point and drive toward it’ does sound simplest. Thanks for weighing in!
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693905129 {#4297
        date: 2023-09-05 11:12:09.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@BlueAure@infosec.pub"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4300 …}
      +nested: Doctrine\ORM\PersistentCollection {#4302 …}
      +votes: Doctrine\ORM\PersistentCollection {#4304 …}
      +reports: Doctrine\ORM\PersistentCollection {#4306 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4308 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4310 …}
      -id: 28062
      -bodyTs: "'algorithm':19 'drive':26 'encod':16 'laser':11 'lean':5 'lidar':23 'm':4 'ok':1 'pick':21 'point':24 'reli':7 'rotari':15 'simpl':18 'simplest':31 'sound':30 'thank':32 'tof':12 'toward':6,27 'weigh':34 'yeah':2"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/212501"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693905129 {#4298
        date: 2023-09-05 11:12:09.0 +02:00
      }
    }
  ]
  +level: 1
  +view: "tree"
  -entryCommentRepository: App\Repository\EntryCommentRepository {#557 …}
  -twig: Twig\Environment {#1252 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
entry_comment App\Twig\Components\EntryCommentComponent 14.0 MiB 6.61 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4299
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4068
      +user: App\Entity\User {#4016
        +avatar: null
        +cover: null
        +email: "BlueAure@infosec.pub"
        +username: "@BlueAure@infosec.pub"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1705400206 {#4076
          date: 2024-01-16 11:16:46.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: false
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: true
        +notifyOnNewEntryCommentReply: true
        +notifyOnNewPost: false
        +notifyOnNewPostReply: true
        +notifyOnNewPostCommentReply: true
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
        +entries: Doctrine\ORM\PersistentCollection {#4010 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
        +posts: Doctrine\ORM\PersistentCollection {#4000 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
        +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
        +follows: Doctrine\ORM\PersistentCollection {#4132 …}
        +followers: Doctrine\ORM\PersistentCollection {#4128 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
        +reports: Doctrine\ORM\PersistentCollection {#4131 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
        +violations: Doctrine\ORM\PersistentCollection {#4121 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
        +awards: Doctrine\ORM\PersistentCollection {#4122 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
        +categories: Doctrine\ORM\PersistentCollection {#4119 …}
        -id: 44380
        -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
        +apId: "BlueAure@infosec.pub"
        +apProfileId: "https://infosec.pub/u/BlueAure"
        +apPublicUrl: "https://infosec.pub/u/BlueAure"
        +apFollowersUrl: null
        +apInboxUrl: "https://infosec.pub/inbox"
        +apDomain: "infosec.pub"
        +apPreferredUsername: "BlueAure"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727801513 {#4072
          date: 2024-10-01 18:51:53.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1693625490 {#4070
          date: 2023-09-02 05:31:30.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693905135 {#4077
        date: 2023-09-05 11:12:15.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4066 …}
      +nested: Doctrine\ORM\PersistentCollection {#4064 …}
      +votes: Doctrine\ORM\PersistentCollection {#4062 …}
      +reports: Doctrine\ORM\PersistentCollection {#4060 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
      -id: 27754
      -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://infosec.pub/comment/2295613"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693625485 {#4013
        date: 2023-09-02 05:31:25.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4068}
    +body: """
      Ok yeah – I’m leaning toward relying more on the laser ToF than the rotary encoders.\n
      \n
      A simple algorithm of ‘pick a lidar point and drive toward it’ does sound simplest. Thanks for weighing in!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905129 {#4297
      date: 2023-09-05 11:12:09.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@BlueAure@infosec.pub"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4300 …}
    +nested: Doctrine\ORM\PersistentCollection {#4302 …}
    +votes: Doctrine\ORM\PersistentCollection {#4304 …}
    +reports: Doctrine\ORM\PersistentCollection {#4306 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4308 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4310 …}
    -id: 28062
    -bodyTs: "'algorithm':19 'drive':26 'encod':16 'laser':11 'lean':5 'lidar':23 'm':4 'ok':1 'pick':21 'point':24 'reli':7 'rotari':15 'simpl':18 'simplest':31 'sound':30 'thank':32 'tof':12 'toward':6,27 'weigh':34 'yeah':2"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212501"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693905129 {#4298
      date: 2023-09-05 11:12:09.0 +02:00
    }
  }
  "showNested" => true
  "level" => 2
  "showEntryTitle" => false
  "showMagazineName" => false
]
Attributes
[]
Component
App\Twig\Components\EntryCommentComponent {#5078
  +comment: App\Entity\EntryComment {#4299
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4068
      +user: App\Entity\User {#4016
        +avatar: null
        +cover: null
        +email: "BlueAure@infosec.pub"
        +username: "@BlueAure@infosec.pub"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1705400206 {#4076
          date: 2024-01-16 11:16:46.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: false
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: true
        +notifyOnNewEntryCommentReply: true
        +notifyOnNewPost: false
        +notifyOnNewPostReply: true
        +notifyOnNewPostCommentReply: true
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
        +entries: Doctrine\ORM\PersistentCollection {#4010 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
        +posts: Doctrine\ORM\PersistentCollection {#4000 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
        +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
        +follows: Doctrine\ORM\PersistentCollection {#4132 …}
        +followers: Doctrine\ORM\PersistentCollection {#4128 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
        +reports: Doctrine\ORM\PersistentCollection {#4131 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
        +violations: Doctrine\ORM\PersistentCollection {#4121 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
        +awards: Doctrine\ORM\PersistentCollection {#4122 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
        +categories: Doctrine\ORM\PersistentCollection {#4119 …}
        -id: 44380
        -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
        +apId: "BlueAure@infosec.pub"
        +apProfileId: "https://infosec.pub/u/BlueAure"
        +apPublicUrl: "https://infosec.pub/u/BlueAure"
        +apFollowersUrl: null
        +apInboxUrl: "https://infosec.pub/inbox"
        +apDomain: "infosec.pub"
        +apPreferredUsername: "BlueAure"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727801513 {#4072
          date: 2024-10-01 18:51:53.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1693625490 {#4070
          date: 2023-09-02 05:31:30.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693905135 {#4077
        date: 2023-09-05 11:12:15.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4066 …}
      +nested: Doctrine\ORM\PersistentCollection {#4064 …}
      +votes: Doctrine\ORM\PersistentCollection {#4062 …}
      +reports: Doctrine\ORM\PersistentCollection {#4060 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
      -id: 27754
      -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://infosec.pub/comment/2295613"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693625485 {#4013
        date: 2023-09-02 05:31:25.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4068}
    +body: """
      Ok yeah – I’m leaning toward relying more on the laser ToF than the rotary encoders.\n
      \n
      A simple algorithm of ‘pick a lidar point and drive toward it’ does sound simplest. Thanks for weighing in!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905129 {#4297
      date: 2023-09-05 11:12:09.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@BlueAure@infosec.pub"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4300 …}
    +nested: Doctrine\ORM\PersistentCollection {#4302 …}
    +votes: Doctrine\ORM\PersistentCollection {#4304 …}
    +reports: Doctrine\ORM\PersistentCollection {#4306 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4308 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4310 …}
    -id: 28062
    -bodyTs: "'algorithm':19 'drive':26 'encod':16 'laser':11 'lean':5 'lidar':23 'm':4 'ok':1 'pick':21 'point':24 'reli':7 'rotari':15 'simpl':18 'simplest':31 'sound':30 'thank':32 'tof':12 'toward':6,27 'weigh':34 'yeah':2"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212501"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693905129 {#4298
      date: 2023-09-05 11:12:09.0 +02:00
    }
  }
  +showMagazineName: false
  +showEntryTitle: false
  +showNested: true
  +level: 2
  +canSeeTrash: false
  +dateAsUrl: false
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -authorizationChecker: Symfony\Component\Security\Core\Authorization\AuthorizationChecker {#931 …}
}
user_inline App\Twig\Components\UserInlineComponent 14.0 MiB 0.14 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#5125
  +user: Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +showAvatar: false
}
date App\Twig\Components\DateComponent 14.0 MiB 0.14 ms
Input props
[
  "date" => DateTimeImmutable @1693905129 {#4298
    date: 2023-09-05 11:12:09.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#5180
  +date: DateTimeImmutable @1693905129 {#4298
    date: 2023-09-05 11:12:09.0 +02:00
  }
}
date_edited App\Twig\Components\DateEditedComponent 14.0 MiB 0.08 ms
Input props
[
  "createdAt" => DateTimeImmutable @1693905129 {#4298
    date: 2023-09-05 11:12:09.0 +02:00
  }
  "editedAt" => null
]
Attributes
[]
Component
App\Twig\Components\DateEditedComponent {#5234
  +createdAt: DateTimeImmutable @1693905129 {#4298
    date: 2023-09-05 11:12:09.0 +02:00
  }
  +editedAt: null
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 0.12 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  "width" => 40
  "height" => 40
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#5288
  +width: 40
  +height: 40
  +user: Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +asLink: true
}
vote App\Twig\Components\VoteComponent 14.0 MiB 0.53 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4299
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4068
      +user: App\Entity\User {#4016
        +avatar: null
        +cover: null
        +email: "BlueAure@infosec.pub"
        +username: "@BlueAure@infosec.pub"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1705400206 {#4076
          date: 2024-01-16 11:16:46.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: false
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: true
        +notifyOnNewEntryCommentReply: true
        +notifyOnNewPost: false
        +notifyOnNewPostReply: true
        +notifyOnNewPostCommentReply: true
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
        +entries: Doctrine\ORM\PersistentCollection {#4010 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
        +posts: Doctrine\ORM\PersistentCollection {#4000 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
        +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
        +follows: Doctrine\ORM\PersistentCollection {#4132 …}
        +followers: Doctrine\ORM\PersistentCollection {#4128 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
        +reports: Doctrine\ORM\PersistentCollection {#4131 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
        +violations: Doctrine\ORM\PersistentCollection {#4121 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
        +awards: Doctrine\ORM\PersistentCollection {#4122 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
        +categories: Doctrine\ORM\PersistentCollection {#4119 …}
        -id: 44380
        -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
        +apId: "BlueAure@infosec.pub"
        +apProfileId: "https://infosec.pub/u/BlueAure"
        +apPublicUrl: "https://infosec.pub/u/BlueAure"
        +apFollowersUrl: null
        +apInboxUrl: "https://infosec.pub/inbox"
        +apDomain: "infosec.pub"
        +apPreferredUsername: "BlueAure"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727801513 {#4072
          date: 2024-10-01 18:51:53.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1693625490 {#4070
          date: 2023-09-02 05:31:30.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693905135 {#4077
        date: 2023-09-05 11:12:15.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4066 …}
      +nested: Doctrine\ORM\PersistentCollection {#4064 …}
      +votes: Doctrine\ORM\PersistentCollection {#4062 …}
      +reports: Doctrine\ORM\PersistentCollection {#4060 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
      -id: 27754
      -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://infosec.pub/comment/2295613"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693625485 {#4013
        date: 2023-09-02 05:31:25.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4068}
    +body: """
      Ok yeah – I’m leaning toward relying more on the laser ToF than the rotary encoders.\n
      \n
      A simple algorithm of ‘pick a lidar point and drive toward it’ does sound simplest. Thanks for weighing in!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905129 {#4297
      date: 2023-09-05 11:12:09.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@BlueAure@infosec.pub"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4300 …}
    +nested: Doctrine\ORM\PersistentCollection {#4302 …}
    +votes: Doctrine\ORM\PersistentCollection {#4304 …}
    +reports: Doctrine\ORM\PersistentCollection {#4306 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4308 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4310 …}
    -id: 28062
    -bodyTs: "'algorithm':19 'drive':26 'encod':16 'laser':11 'lean':5 'lidar':23 'm':4 'ok':1 'pick':21 'point':24 'reli':7 'rotari':15 'simpl':18 'simplest':31 'sound':30 'thank':32 'tof':12 'toward':6,27 'weigh':34 'yeah':2"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212501"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693905129 {#4298
      date: 2023-09-05 11:12:09.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\VoteComponent {#5361
  +subject: App\Entity\EntryComment {#4299
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4068
      +user: App\Entity\User {#4016
        +avatar: null
        +cover: null
        +email: "BlueAure@infosec.pub"
        +username: "@BlueAure@infosec.pub"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1705400206 {#4076
          date: 2024-01-16 11:16:46.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: false
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: true
        +notifyOnNewEntryCommentReply: true
        +notifyOnNewPost: false
        +notifyOnNewPostReply: true
        +notifyOnNewPostCommentReply: true
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
        +entries: Doctrine\ORM\PersistentCollection {#4010 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
        +posts: Doctrine\ORM\PersistentCollection {#4000 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
        +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
        +follows: Doctrine\ORM\PersistentCollection {#4132 …}
        +followers: Doctrine\ORM\PersistentCollection {#4128 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
        +reports: Doctrine\ORM\PersistentCollection {#4131 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
        +violations: Doctrine\ORM\PersistentCollection {#4121 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
        +awards: Doctrine\ORM\PersistentCollection {#4122 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
        +categories: Doctrine\ORM\PersistentCollection {#4119 …}
        -id: 44380
        -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
        +apId: "BlueAure@infosec.pub"
        +apProfileId: "https://infosec.pub/u/BlueAure"
        +apPublicUrl: "https://infosec.pub/u/BlueAure"
        +apFollowersUrl: null
        +apInboxUrl: "https://infosec.pub/inbox"
        +apDomain: "infosec.pub"
        +apPreferredUsername: "BlueAure"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727801513 {#4072
          date: 2024-10-01 18:51:53.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1693625490 {#4070
          date: 2023-09-02 05:31:30.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693905135 {#4077
        date: 2023-09-05 11:12:15.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4066 …}
      +nested: Doctrine\ORM\PersistentCollection {#4064 …}
      +votes: Doctrine\ORM\PersistentCollection {#4062 …}
      +reports: Doctrine\ORM\PersistentCollection {#4060 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
      -id: 27754
      -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://infosec.pub/comment/2295613"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693625485 {#4013
        date: 2023-09-02 05:31:25.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4068}
    +body: """
      Ok yeah – I’m leaning toward relying more on the laser ToF than the rotary encoders.\n
      \n
      A simple algorithm of ‘pick a lidar point and drive toward it’ does sound simplest. Thanks for weighing in!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905129 {#4297
      date: 2023-09-05 11:12:09.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@BlueAure@infosec.pub"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4300 …}
    +nested: Doctrine\ORM\PersistentCollection {#4302 …}
    +votes: Doctrine\ORM\PersistentCollection {#4304 …}
    +reports: Doctrine\ORM\PersistentCollection {#4306 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4308 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4310 …}
    -id: 28062
    -bodyTs: "'algorithm':19 'drive':26 'encod':16 'laser':11 'lean':5 'lidar':23 'm':4 'ok':1 'pick':21 'point':24 'reli':7 'rotari':15 'simpl':18 'simplest':31 'sound':30 'thank':32 'tof':12 'toward':6,27 'weigh':34 'yeah':2"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212501"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693905129 {#4298
      date: 2023-09-05 11:12:09.0 +02:00
    }
  }
  +formDest: "entry_comment"
  +showDownvote: true
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
boost App\Twig\Components\BoostComponent 14.0 MiB 0.64 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4299
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4068
      +user: App\Entity\User {#4016
        +avatar: null
        +cover: null
        +email: "BlueAure@infosec.pub"
        +username: "@BlueAure@infosec.pub"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1705400206 {#4076
          date: 2024-01-16 11:16:46.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: false
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: true
        +notifyOnNewEntryCommentReply: true
        +notifyOnNewPost: false
        +notifyOnNewPostReply: true
        +notifyOnNewPostCommentReply: true
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
        +entries: Doctrine\ORM\PersistentCollection {#4010 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
        +posts: Doctrine\ORM\PersistentCollection {#4000 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
        +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
        +follows: Doctrine\ORM\PersistentCollection {#4132 …}
        +followers: Doctrine\ORM\PersistentCollection {#4128 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
        +reports: Doctrine\ORM\PersistentCollection {#4131 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
        +violations: Doctrine\ORM\PersistentCollection {#4121 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
        +awards: Doctrine\ORM\PersistentCollection {#4122 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
        +categories: Doctrine\ORM\PersistentCollection {#4119 …}
        -id: 44380
        -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
        +apId: "BlueAure@infosec.pub"
        +apProfileId: "https://infosec.pub/u/BlueAure"
        +apPublicUrl: "https://infosec.pub/u/BlueAure"
        +apFollowersUrl: null
        +apInboxUrl: "https://infosec.pub/inbox"
        +apDomain: "infosec.pub"
        +apPreferredUsername: "BlueAure"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727801513 {#4072
          date: 2024-10-01 18:51:53.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1693625490 {#4070
          date: 2023-09-02 05:31:30.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693905135 {#4077
        date: 2023-09-05 11:12:15.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4066 …}
      +nested: Doctrine\ORM\PersistentCollection {#4064 …}
      +votes: Doctrine\ORM\PersistentCollection {#4062 …}
      +reports: Doctrine\ORM\PersistentCollection {#4060 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
      -id: 27754
      -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://infosec.pub/comment/2295613"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693625485 {#4013
        date: 2023-09-02 05:31:25.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4068}
    +body: """
      Ok yeah – I’m leaning toward relying more on the laser ToF than the rotary encoders.\n
      \n
      A simple algorithm of ‘pick a lidar point and drive toward it’ does sound simplest. Thanks for weighing in!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905129 {#4297
      date: 2023-09-05 11:12:09.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@BlueAure@infosec.pub"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4300 …}
    +nested: Doctrine\ORM\PersistentCollection {#4302 …}
    +votes: Doctrine\ORM\PersistentCollection {#4304 …}
    +reports: Doctrine\ORM\PersistentCollection {#4306 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4308 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4310 …}
    -id: 28062
    -bodyTs: "'algorithm':19 'drive':26 'encod':16 'laser':11 'lean':5 'lidar':23 'm':4 'ok':1 'pick':21 'point':24 'reli':7 'rotari':15 'simpl':18 'simplest':31 'sound':30 'thank':32 'tof':12 'toward':6,27 'weigh':34 'yeah':2"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212501"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693905129 {#4298
      date: 2023-09-05 11:12:09.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\BoostComponent {#5418
  +formDest: "entry_comment"
  +subject: App\Entity\EntryComment {#4299
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4068
      +user: App\Entity\User {#4016
        +avatar: null
        +cover: null
        +email: "BlueAure@infosec.pub"
        +username: "@BlueAure@infosec.pub"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1705400206 {#4076
          date: 2024-01-16 11:16:46.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: false
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: true
        +notifyOnNewEntryCommentReply: true
        +notifyOnNewPost: false
        +notifyOnNewPostReply: true
        +notifyOnNewPostCommentReply: true
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
        +entries: Doctrine\ORM\PersistentCollection {#4010 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
        +posts: Doctrine\ORM\PersistentCollection {#4000 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
        +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
        +follows: Doctrine\ORM\PersistentCollection {#4132 …}
        +followers: Doctrine\ORM\PersistentCollection {#4128 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
        +reports: Doctrine\ORM\PersistentCollection {#4131 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
        +violations: Doctrine\ORM\PersistentCollection {#4121 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
        +awards: Doctrine\ORM\PersistentCollection {#4122 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
        +categories: Doctrine\ORM\PersistentCollection {#4119 …}
        -id: 44380
        -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
        +apId: "BlueAure@infosec.pub"
        +apProfileId: "https://infosec.pub/u/BlueAure"
        +apPublicUrl: "https://infosec.pub/u/BlueAure"
        +apFollowersUrl: null
        +apInboxUrl: "https://infosec.pub/inbox"
        +apDomain: "infosec.pub"
        +apPreferredUsername: "BlueAure"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727801513 {#4072
          date: 2024-10-01 18:51:53.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1693625490 {#4070
          date: 2023-09-02 05:31:30.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693905135 {#4077
        date: 2023-09-05 11:12:15.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4066 …}
      +nested: Doctrine\ORM\PersistentCollection {#4064 …}
      +votes: Doctrine\ORM\PersistentCollection {#4062 …}
      +reports: Doctrine\ORM\PersistentCollection {#4060 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
      -id: 27754
      -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://infosec.pub/comment/2295613"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693625485 {#4013
        date: 2023-09-02 05:31:25.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4068}
    +body: """
      Ok yeah – I’m leaning toward relying more on the laser ToF than the rotary encoders.\n
      \n
      A simple algorithm of ‘pick a lidar point and drive toward it’ does sound simplest. Thanks for weighing in!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905129 {#4297
      date: 2023-09-05 11:12:09.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@BlueAure@infosec.pub"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4300 …}
    +nested: Doctrine\ORM\PersistentCollection {#4302 …}
    +votes: Doctrine\ORM\PersistentCollection {#4304 …}
    +reports: Doctrine\ORM\PersistentCollection {#4306 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4308 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4310 …}
    -id: 28062
    -bodyTs: "'algorithm':19 'drive':26 'encod':16 'laser':11 'lean':5 'lidar':23 'm':4 'ok':1 'pick':21 'point':24 'reli':7 'rotari':15 'simpl':18 'simplest':31 'sound':30 'thank':32 'tof':12 'toward':6,27 'weigh':34 'yeah':2"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212501"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693905129 {#4298
      date: 2023-09-05 11:12:09.0 +02:00
    }
  }
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
entry_comments_nested App\Twig\Components\EntryCommentsNestedComponent 14.0 MiB 0.31 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4299
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4068
      +user: App\Entity\User {#4016
        +avatar: null
        +cover: null
        +email: "BlueAure@infosec.pub"
        +username: "@BlueAure@infosec.pub"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1705400206 {#4076
          date: 2024-01-16 11:16:46.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: false
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: true
        +notifyOnNewEntryCommentReply: true
        +notifyOnNewPost: false
        +notifyOnNewPostReply: true
        +notifyOnNewPostCommentReply: true
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
        +entries: Doctrine\ORM\PersistentCollection {#4010 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
        +posts: Doctrine\ORM\PersistentCollection {#4000 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
        +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
        +follows: Doctrine\ORM\PersistentCollection {#4132 …}
        +followers: Doctrine\ORM\PersistentCollection {#4128 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
        +reports: Doctrine\ORM\PersistentCollection {#4131 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
        +violations: Doctrine\ORM\PersistentCollection {#4121 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
        +awards: Doctrine\ORM\PersistentCollection {#4122 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
        +categories: Doctrine\ORM\PersistentCollection {#4119 …}
        -id: 44380
        -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
        +apId: "BlueAure@infosec.pub"
        +apProfileId: "https://infosec.pub/u/BlueAure"
        +apPublicUrl: "https://infosec.pub/u/BlueAure"
        +apFollowersUrl: null
        +apInboxUrl: "https://infosec.pub/inbox"
        +apDomain: "infosec.pub"
        +apPreferredUsername: "BlueAure"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727801513 {#4072
          date: 2024-10-01 18:51:53.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1693625490 {#4070
          date: 2023-09-02 05:31:30.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693905135 {#4077
        date: 2023-09-05 11:12:15.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4066 …}
      +nested: Doctrine\ORM\PersistentCollection {#4064 …}
      +votes: Doctrine\ORM\PersistentCollection {#4062 …}
      +reports: Doctrine\ORM\PersistentCollection {#4060 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
      -id: 27754
      -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://infosec.pub/comment/2295613"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693625485 {#4013
        date: 2023-09-02 05:31:25.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4068}
    +body: """
      Ok yeah – I’m leaning toward relying more on the laser ToF than the rotary encoders.\n
      \n
      A simple algorithm of ‘pick a lidar point and drive toward it’ does sound simplest. Thanks for weighing in!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905129 {#4297
      date: 2023-09-05 11:12:09.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@BlueAure@infosec.pub"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4300 …}
    +nested: Doctrine\ORM\PersistentCollection {#4302 …}
    +votes: Doctrine\ORM\PersistentCollection {#4304 …}
    +reports: Doctrine\ORM\PersistentCollection {#4306 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4308 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4310 …}
    -id: 28062
    -bodyTs: "'algorithm':19 'drive':26 'encod':16 'laser':11 'lean':5 'lidar':23 'm':4 'ok':1 'pick':21 'point':24 'reli':7 'rotari':15 'simpl':18 'simplest':31 'sound':30 'thank':32 'tof':12 'toward':6,27 'weigh':34 'yeah':2"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212501"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693905129 {#4298
      date: 2023-09-05 11:12:09.0 +02:00
    }
  }
  "level" => 2
  "showNested" => true
  "view" => "tree"
]
Attributes
[
  "showNested" => true
]
Component
App\Twig\Components\EntryCommentsNestedComponent {#5658
  +comment: App\Entity\EntryComment {#4299
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4068
      +user: App\Entity\User {#4016
        +avatar: null
        +cover: null
        +email: "BlueAure@infosec.pub"
        +username: "@BlueAure@infosec.pub"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1705400206 {#4076
          date: 2024-01-16 11:16:46.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: false
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: true
        +notifyOnNewEntryCommentReply: true
        +notifyOnNewPost: false
        +notifyOnNewPostReply: true
        +notifyOnNewPostCommentReply: true
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4017 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4020 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4012 …}
        +entries: Doctrine\ORM\PersistentCollection {#4010 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4008 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4005 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4003 …}
        +posts: Doctrine\ORM\PersistentCollection {#4000 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#3998 …}
        +postComments: Doctrine\ORM\PersistentCollection {#3996 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#3993 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#3991 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#3989 …}
        +follows: Doctrine\ORM\PersistentCollection {#4132 …}
        +followers: Doctrine\ORM\PersistentCollection {#4128 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4117 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4108 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4097 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4134 …}
        +reports: Doctrine\ORM\PersistentCollection {#4131 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4094 …}
        +violations: Doctrine\ORM\PersistentCollection {#4121 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4124 …}
        +awards: Doctrine\ORM\PersistentCollection {#4122 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4120 …}
        +categories: Doctrine\ORM\PersistentCollection {#4119 …}
        -id: 44380
        -password: "$2y$13$GSubltC6va0KaRGEp1mNROI55tgjWJWyZvJu6KO64IjLH9cJ3Vtgq"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4112 …}
        +apId: "BlueAure@infosec.pub"
        +apProfileId: "https://infosec.pub/u/BlueAure"
        +apPublicUrl: "https://infosec.pub/u/BlueAure"
        +apFollowersUrl: null
        +apInboxUrl: "https://infosec.pub/inbox"
        +apDomain: "infosec.pub"
        +apPreferredUsername: "BlueAure"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727801513 {#4072
          date: 2024-10-01 18:51:53.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1693625490 {#4070
          date: 2023-09-02 05:31:30.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Assuming that there is at least some amount of slippage between the wheel and ground, it seems to me that you’ll need to regularly check the ToF sensors anyway. I’ve found that encoders are fantastic for a lot of things, but not so much for measuring distance because of the problems you’ve described. Perhaps a recurring local check on a reduced set of points to verify location then forward the full cloud less often for further remote processing? It really sounds like you have a tradeoff depending on whether you value accuracy of location or accuracy of wheel rpm (analogous to speed). Using both would give you a nice way to calculate the ideal motor rpm to minimize slippage in a surface agnostic way."
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693905135 {#4077
        date: 2023-09-05 11:12:15.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4066 …}
      +nested: Doctrine\ORM\PersistentCollection {#4064 …}
      +votes: Doctrine\ORM\PersistentCollection {#4062 …}
      +reports: Doctrine\ORM\PersistentCollection {#4060 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4028 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4032 …}
      -id: 27754
      -bodyTs: "'accuraci':95,99 'agnost':126 'amount':8 'analog':103 'anyway':30 'assum':1 'calcul':115 'check':26,61 'cloud':75 'depend':90 'describ':56 'distanc':49 'encod':35 'fantast':37 'forward':72 'found':33 'full':74 'give':109 'ground':15 'ideal':117 'least':6 'less':76 'like':85 'll':22 'local':60 'locat':70,97 'lot':40 'measur':48 'minim':121 'motor':118 'much':46 'need':23 'nice':112 'often':77 'perhap':57 'point':67 'problem':53 'process':81 'realli':83 'recur':59 'reduc':64 'regular':25 'remot':80 'rpm':102,119 'seem':17 'sensor':29 'set':65 'slippag':10,122 'sound':84 'speed':105 'surfac':125 'thing':42 'tof':28 'tradeoff':89 'use':106 'valu':94 've':32,55 'verifi':69 'way':113,127 'wheel':13,101 'whether':92 'would':108"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://infosec.pub/comment/2295613"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693625485 {#4013
        date: 2023-09-02 05:31:25.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4068}
    +body: """
      Ok yeah – I’m leaning toward relying more on the laser ToF than the rotary encoders.\n
      \n
      A simple algorithm of ‘pick a lidar point and drive toward it’ does sound simplest. Thanks for weighing in!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693905129 {#4297
      date: 2023-09-05 11:12:09.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@BlueAure@infosec.pub"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4300 …}
    +nested: Doctrine\ORM\PersistentCollection {#4302 …}
    +votes: Doctrine\ORM\PersistentCollection {#4304 …}
    +reports: Doctrine\ORM\PersistentCollection {#4306 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4308 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4310 …}
    -id: 28062
    -bodyTs: "'algorithm':19 'drive':26 'encod':16 'laser':11 'lean':5 'lidar':23 'm':4 'ok':1 'pick':21 'point':24 'reli':7 'rotari':15 'simpl':18 'simplest':31 'sound':30 'thank':32 'tof':12 'toward':6,27 'weigh':34 'yeah':2"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212501"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693905129 {#4298
      date: 2023-09-05 11:12:09.0 +02:00
    }
  }
  +nestedComments: []
  +level: 2
  +view: "tree"
  -entryCommentRepository: App\Repository\EntryCommentRepository {#557 …}
  -twig: Twig\Environment {#1252 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
entry_comment App\Twig\Components\EntryCommentComponent 14.0 MiB 52.77 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4105
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: """
      I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
      \n
      You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
      \n
      And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1694071778 {#4106
      date: 2023-09-07 09:29:38.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4103 …}
    +nested: Doctrine\ORM\PersistentCollection {#4101 …}
    +votes: Doctrine\ORM\PersistentCollection {#4099 …}
    +reports: Doctrine\ORM\PersistentCollection {#4096 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
    -id: 27597
    -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2572674"
    +editedAt: DateTimeImmutable @1693564680 {#4111
      date: 2023-09-01 12:38:00.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693564547 {#4109
      date: 2023-09-01 12:35:47.0 +02:00
    }
  }
  "showNested" => true
  "dateAsUrl" => false
  "showMagazineName" => false
  "showEntryTitle" => false
]
Attributes
[]
Component
App\Twig\Components\EntryCommentComponent {#5734
  +comment: App\Entity\EntryComment {#4105
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: """
      I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
      \n
      You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
      \n
      And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1694071778 {#4106
      date: 2023-09-07 09:29:38.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4103 …}
    +nested: Doctrine\ORM\PersistentCollection {#4101 …}
    +votes: Doctrine\ORM\PersistentCollection {#4099 …}
    +reports: Doctrine\ORM\PersistentCollection {#4096 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
    -id: 27597
    -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2572674"
    +editedAt: DateTimeImmutable @1693564680 {#4111
      date: 2023-09-01 12:38:00.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693564547 {#4109
      date: 2023-09-01 12:35:47.0 +02:00
    }
  }
  +showMagazineName: false
  +showEntryTitle: false
  +showNested: true
  +level: 1
  +canSeeTrash: false
  +dateAsUrl: false
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -authorizationChecker: Symfony\Component\Security\Core\Authorization\AuthorizationChecker {#931 …}
}
user_inline App\Twig\Components\UserInlineComponent 14.0 MiB 0.13 ms
Input props
[
  "user" => App\Entity\User {#4088
    +avatar: null
    +cover: null
    +email: "rufus@discuss.tchncs.de"
    +username: "@rufus@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1729234169 {#4110
      date: 2024-10-18 08:49:29.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
    +entries: Doctrine\ORM\PersistentCollection {#4081 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
    +posts: Doctrine\ORM\PersistentCollection {#4141 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
    +follows: Doctrine\ORM\PersistentCollection {#4153 …}
    +followers: Doctrine\ORM\PersistentCollection {#4155 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
    +reports: Doctrine\ORM\PersistentCollection {#4165 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
    +violations: Doctrine\ORM\PersistentCollection {#4169 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
    +awards: Doctrine\ORM\PersistentCollection {#4173 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
    +categories: Doctrine\ORM\PersistentCollection {#4177 …}
    -id: 22773
    -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
    +apId: "rufus@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/rufus"
    +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "rufus"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728254912 {#4107
      date: 2024-10-07 00:48:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689082128 {#4100
      date: 2023-07-11 15:28:48.0 +02:00
    }
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#5779
  +user: App\Entity\User {#4088
    +avatar: null
    +cover: null
    +email: "rufus@discuss.tchncs.de"
    +username: "@rufus@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1729234169 {#4110
      date: 2024-10-18 08:49:29.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
    +entries: Doctrine\ORM\PersistentCollection {#4081 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
    +posts: Doctrine\ORM\PersistentCollection {#4141 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
    +follows: Doctrine\ORM\PersistentCollection {#4153 …}
    +followers: Doctrine\ORM\PersistentCollection {#4155 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
    +reports: Doctrine\ORM\PersistentCollection {#4165 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
    +violations: Doctrine\ORM\PersistentCollection {#4169 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
    +awards: Doctrine\ORM\PersistentCollection {#4173 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
    +categories: Doctrine\ORM\PersistentCollection {#4177 …}
    -id: 22773
    -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
    +apId: "rufus@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/rufus"
    +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "rufus"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728254912 {#4107
      date: 2024-10-07 00:48:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689082128 {#4100
      date: 2023-07-11 15:28:48.0 +02:00
    }
  }
  +showAvatar: false
}
date App\Twig\Components\DateComponent 14.0 MiB 0.17 ms
Input props
[
  "date" => DateTimeImmutable @1693564547 {#4109
    date: 2023-09-01 12:35:47.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#5834
  +date: DateTimeImmutable @1693564547 {#4109
    date: 2023-09-01 12:35:47.0 +02:00
  }
}
date_edited App\Twig\Components\DateEditedComponent 14.0 MiB 0.09 ms
Input props
[
  "createdAt" => DateTimeImmutable @1693564547 {#4109
    date: 2023-09-01 12:35:47.0 +02:00
  }
  "editedAt" => DateTimeImmutable @1693564680 {#4111
    date: 2023-09-01 12:38:00.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateEditedComponent {#5888
  +createdAt: DateTimeImmutable @1693564547 {#4109
    date: 2023-09-01 12:35:47.0 +02:00
  }
  +editedAt: DateTimeImmutable @1693564680 {#4111
    date: 2023-09-01 12:38:00.0 +02:00
  }
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 0.14 ms
Input props
[
  "user" => App\Entity\User {#4088
    +avatar: null
    +cover: null
    +email: "rufus@discuss.tchncs.de"
    +username: "@rufus@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1729234169 {#4110
      date: 2024-10-18 08:49:29.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
    +entries: Doctrine\ORM\PersistentCollection {#4081 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
    +posts: Doctrine\ORM\PersistentCollection {#4141 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
    +follows: Doctrine\ORM\PersistentCollection {#4153 …}
    +followers: Doctrine\ORM\PersistentCollection {#4155 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
    +reports: Doctrine\ORM\PersistentCollection {#4165 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
    +violations: Doctrine\ORM\PersistentCollection {#4169 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
    +awards: Doctrine\ORM\PersistentCollection {#4173 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
    +categories: Doctrine\ORM\PersistentCollection {#4177 …}
    -id: 22773
    -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
    +apId: "rufus@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/rufus"
    +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "rufus"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728254912 {#4107
      date: 2024-10-07 00:48:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689082128 {#4100
      date: 2023-07-11 15:28:48.0 +02:00
    }
  }
  "width" => 40
  "height" => 40
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#5942
  +width: 40
  +height: 40
  +user: App\Entity\User {#4088
    +avatar: null
    +cover: null
    +email: "rufus@discuss.tchncs.de"
    +username: "@rufus@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1729234169 {#4110
      date: 2024-10-18 08:49:29.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
    +entries: Doctrine\ORM\PersistentCollection {#4081 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
    +posts: Doctrine\ORM\PersistentCollection {#4141 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
    +follows: Doctrine\ORM\PersistentCollection {#4153 …}
    +followers: Doctrine\ORM\PersistentCollection {#4155 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
    +reports: Doctrine\ORM\PersistentCollection {#4165 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
    +violations: Doctrine\ORM\PersistentCollection {#4169 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
    +awards: Doctrine\ORM\PersistentCollection {#4173 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
    +categories: Doctrine\ORM\PersistentCollection {#4177 …}
    -id: 22773
    -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
    +apId: "rufus@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/rufus"
    +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "rufus"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728254912 {#4107
      date: 2024-10-07 00:48:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689082128 {#4100
      date: 2023-07-11 15:28:48.0 +02:00
    }
  }
  +asLink: true
}
vote App\Twig\Components\VoteComponent 14.0 MiB 0.34 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4105
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: """
      I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
      \n
      You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
      \n
      And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1694071778 {#4106
      date: 2023-09-07 09:29:38.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4103 …}
    +nested: Doctrine\ORM\PersistentCollection {#4101 …}
    +votes: Doctrine\ORM\PersistentCollection {#4099 …}
    +reports: Doctrine\ORM\PersistentCollection {#4096 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
    -id: 27597
    -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2572674"
    +editedAt: DateTimeImmutable @1693564680 {#4111
      date: 2023-09-01 12:38:00.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693564547 {#4109
      date: 2023-09-01 12:35:47.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\VoteComponent {#6019
  +subject: App\Entity\EntryComment {#4105
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: """
      I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
      \n
      You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
      \n
      And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1694071778 {#4106
      date: 2023-09-07 09:29:38.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4103 …}
    +nested: Doctrine\ORM\PersistentCollection {#4101 …}
    +votes: Doctrine\ORM\PersistentCollection {#4099 …}
    +reports: Doctrine\ORM\PersistentCollection {#4096 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
    -id: 27597
    -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2572674"
    +editedAt: DateTimeImmutable @1693564680 {#4111
      date: 2023-09-01 12:38:00.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693564547 {#4109
      date: 2023-09-01 12:35:47.0 +02:00
    }
  }
  +formDest: "entry_comment"
  +showDownvote: true
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
boost App\Twig\Components\BoostComponent 14.0 MiB 0.62 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4105
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: """
      I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
      \n
      You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
      \n
      And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1694071778 {#4106
      date: 2023-09-07 09:29:38.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4103 …}
    +nested: Doctrine\ORM\PersistentCollection {#4101 …}
    +votes: Doctrine\ORM\PersistentCollection {#4099 …}
    +reports: Doctrine\ORM\PersistentCollection {#4096 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
    -id: 27597
    -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2572674"
    +editedAt: DateTimeImmutable @1693564680 {#4111
      date: 2023-09-01 12:38:00.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693564547 {#4109
      date: 2023-09-01 12:35:47.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\BoostComponent {#6076
  +formDest: "entry_comment"
  +subject: App\Entity\EntryComment {#4105
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: """
      I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
      \n
      You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
      \n
      And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1694071778 {#4106
      date: 2023-09-07 09:29:38.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4103 …}
    +nested: Doctrine\ORM\PersistentCollection {#4101 …}
    +votes: Doctrine\ORM\PersistentCollection {#4099 …}
    +reports: Doctrine\ORM\PersistentCollection {#4096 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
    -id: 27597
    -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2572674"
    +editedAt: DateTimeImmutable @1693564680 {#4111
      date: 2023-09-01 12:38:00.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693564547 {#4109
      date: 2023-09-01 12:35:47.0 +02:00
    }
  }
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
entry_comments_nested App\Twig\Components\EntryCommentsNestedComponent 14.0 MiB 45.66 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4105
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: """
      I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
      \n
      You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
      \n
      And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1694071778 {#4106
      date: 2023-09-07 09:29:38.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4103 …}
    +nested: Doctrine\ORM\PersistentCollection {#4101 …}
    +votes: Doctrine\ORM\PersistentCollection {#4099 …}
    +reports: Doctrine\ORM\PersistentCollection {#4096 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
    -id: 27597
    -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2572674"
    +editedAt: DateTimeImmutable @1693564680 {#4111
      date: 2023-09-01 12:38:00.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693564547 {#4109
      date: 2023-09-01 12:35:47.0 +02:00
    }
  }
  "level" => 1
  "showNested" => true
  "view" => "tree"
]
Attributes
[
  "showNested" => true
]
Component
App\Twig\Components\EntryCommentsNestedComponent {#6316
  +comment: App\Entity\EntryComment {#4105
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: """
      I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
      \n
      You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
      \n
      And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1694071778 {#4106
      date: 2023-09-07 09:29:38.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4103 …}
    +nested: Doctrine\ORM\PersistentCollection {#4101 …}
    +votes: Doctrine\ORM\PersistentCollection {#4099 …}
    +reports: Doctrine\ORM\PersistentCollection {#4096 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
    -id: 27597
    -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2572674"
    +editedAt: DateTimeImmutable @1693564680 {#4111
      date: 2023-09-01 12:38:00.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693564547 {#4109
      date: 2023-09-01 12:35:47.0 +02:00
    }
  }
  +nestedComments: [
    28122 => App\Entity\EntryComment {#4372
      +user: App\Entity\User {#4088}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4350
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4319
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4284
            +user: Proxies\__CG__\App\Entity\User {#1961 …2}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: App\Entity\EntryComment {#4105}
            +root: App\Entity\EntryComment {#4105}
            +body: """
              They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
              \n
              I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1693906684 {#4282
              date: 2023-09-05 11:38:04.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
              "@rufus@discuss.tchncs.de"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4285 …}
            +nested: Doctrine\ORM\PersistentCollection {#4287 …}
            +votes: Doctrine\ORM\PersistentCollection {#4289 …}
            +reports: Doctrine\ORM\PersistentCollection {#4291 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
            -id: 28063
            -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://voltage.vn/comment/212522"
            +editedAt: null
            +createdAt: DateTimeImmutable @1693906684 {#4283
              date: 2023-09-05 11:38:04.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
            \n
            Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
            \n
            Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
            \n
            Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
            \n
            If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
            \n
            I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693914344 {#4323
            date: 2023-09-05 13:45:44.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4316 …}
          +nested: Doctrine\ORM\PersistentCollection {#4314 …}
          +votes: Doctrine\ORM\PersistentCollection {#4318 …}
          +reports: Doctrine\ORM\PersistentCollection {#4329 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
          -id: 28065
          -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2687935"
          +editedAt: DateTimeImmutable @1693914611 {#4326
            date: 2023-09-05 13:50:11.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693914344 {#4322
            date: 2023-09-05 13:45:44.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
          \n
          I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
          \n
          I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
          \n
          Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693974973 {#4345
          date: 2023-09-06 06:36:13.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4342 …}
        +nested: Doctrine\ORM\PersistentCollection {#4339 …}
        +votes: Doctrine\ORM\PersistentCollection {#4337 …}
        +reports: Doctrine\ORM\PersistentCollection {#4351 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
        -id: 28109
        -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/213919"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693974973 {#4348
          date: 2023-09-06 06:36:13.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
        \n
        > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
        \n
        Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
        \n
        > API-like to abstract away the low-level components\n
        \n
        You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
        \n
        > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
        \n
        I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
        \n
        As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
        \n
        Definitely hope you’ll have fun being involved in that STEM program.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693999848 {#4367
        date: 2023-09-06 13:30:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4364 …}
      +nested: Doctrine\ORM\PersistentCollection {#4361 …}
      +votes: Doctrine\ORM\PersistentCollection {#4359 …}
      +reports: Doctrine\ORM\PersistentCollection {#4373 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
      -id: 28122
      -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2715856"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693999848 {#4370
        date: 2023-09-06 13:30:48.0 +02:00
      }
    }
    28109 => App\Entity\EntryComment {#4350}
    28063 => App\Entity\EntryComment {#4284}
    28065 => App\Entity\EntryComment {#4319}
    28234 => App\Entity\EntryComment {#4394
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4372}
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Good advice all around! Thanks!\n
        \n
        I’ve also messed around with the ESP8266 and various models of ESP32. Their WiFi time-of-flight stuff is *interesting*. I’ve quite a few projects with both actually! My main complaint is that the GPIO don’t behave nicely (also the esp8266 is a power hog and reboots if you screw up the network stack). They are much slower than I’d expect, and have weird states on boot. It’s not too bad to work around this stuff, but I chose the Pi Pico W so as not to have to explain it.\n
        \n
        It still blows me away that I can easily do public-private key encryption on the ESP32. And graphics. At the same time!
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 1
      +score: 0
      +lastActive: DateTime @1694071771 {#4389
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4386 …}
      +nested: Doctrine\ORM\PersistentCollection {#4383 …}
      +votes: Doctrine\ORM\PersistentCollection {#4381 …}
      +reports: Doctrine\ORM\PersistentCollection {#4395 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4397 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4399 …}
      -id: 28234
      -bodyTs: "'actual':36 'advic':2 'also':8,48 'around':4,10,85 'away':107 'bad':82 'behav':46 'blow':105 'boot':77 'chose':90 'complaint':39 'd':70 'easili':111 'encrypt':117 'esp32':18,120 'esp8266':13,50 'expect':71 'explain':101 'flight':24 'good':1 'gpio':43 'graphic':122 'hog':54 'interest':27 'key':116 'main':38 'mess':9 'model':16 'much':66 'network':62 'nice':47 'pi':92 'pico':93 'power':53 'privat':115 'project':33 'public':114 'public-priv':113 'quit':30 'reboot':56 'screw':59 'slower':67 'stack':63 'state':75 'still':104 'stuff':25,87 'thank':5 'time':22,126 'time-of-flight':21 'various':15 've':7,29 'w':94 'weird':74 'wifi':20 'work':84"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/216358"
      +editedAt: null
      +createdAt: DateTimeImmutable @1694071771 {#4392
        date: 2023-09-07 09:29:31.0 +02:00
      }
    }
  ]
  +level: 1
  +view: "tree"
  -entryCommentRepository: App\Repository\EntryCommentRepository {#557 …}
  -twig: Twig\Environment {#1252 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
entry_comment App\Twig\Components\EntryCommentComponent 14.0 MiB 44.44 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4284
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4105
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: """
        I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
        \n
        You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
        \n
        And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1694071778 {#4106
        date: 2023-09-07 09:29:38.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4103 …}
      +nested: Doctrine\ORM\PersistentCollection {#4101 …}
      +votes: Doctrine\ORM\PersistentCollection {#4099 …}
      +reports: Doctrine\ORM\PersistentCollection {#4096 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
      -id: 27597
      -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2572674"
      +editedAt: DateTimeImmutable @1693564680 {#4111
        date: 2023-09-01 12:38:00.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693564547 {#4109
        date: 2023-09-01 12:35:47.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
      \n
      I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906684 {#4282
      date: 2023-09-05 11:38:04.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4285 …}
    +nested: Doctrine\ORM\PersistentCollection {#4287 …}
    +votes: Doctrine\ORM\PersistentCollection {#4289 …}
    +reports: Doctrine\ORM\PersistentCollection {#4291 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
    -id: 28063
    -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212522"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906684 {#4283
      date: 2023-09-05 11:38:04.0 +02:00
    }
  }
  "showNested" => true
  "level" => 2
  "showEntryTitle" => false
  "showMagazineName" => false
]
Attributes
[]
Component
App\Twig\Components\EntryCommentComponent {#6376
  +comment: App\Entity\EntryComment {#4284
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4105
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: """
        I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
        \n
        You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
        \n
        And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1694071778 {#4106
        date: 2023-09-07 09:29:38.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4103 …}
      +nested: Doctrine\ORM\PersistentCollection {#4101 …}
      +votes: Doctrine\ORM\PersistentCollection {#4099 …}
      +reports: Doctrine\ORM\PersistentCollection {#4096 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
      -id: 27597
      -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2572674"
      +editedAt: DateTimeImmutable @1693564680 {#4111
        date: 2023-09-01 12:38:00.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693564547 {#4109
        date: 2023-09-01 12:35:47.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
      \n
      I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906684 {#4282
      date: 2023-09-05 11:38:04.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4285 …}
    +nested: Doctrine\ORM\PersistentCollection {#4287 …}
    +votes: Doctrine\ORM\PersistentCollection {#4289 …}
    +reports: Doctrine\ORM\PersistentCollection {#4291 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
    -id: 28063
    -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212522"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906684 {#4283
      date: 2023-09-05 11:38:04.0 +02:00
    }
  }
  +showMagazineName: false
  +showEntryTitle: false
  +showNested: true
  +level: 2
  +canSeeTrash: false
  +dateAsUrl: false
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -authorizationChecker: Symfony\Component\Security\Core\Authorization\AuthorizationChecker {#931 …}
}
user_inline App\Twig\Components\UserInlineComponent 14.0 MiB 0.14 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#6421
  +user: Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +showAvatar: false
}
date App\Twig\Components\DateComponent 14.0 MiB 0.13 ms
Input props
[
  "date" => DateTimeImmutable @1693906684 {#4283
    date: 2023-09-05 11:38:04.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#6476
  +date: DateTimeImmutable @1693906684 {#4283
    date: 2023-09-05 11:38:04.0 +02:00
  }
}
date_edited App\Twig\Components\DateEditedComponent 14.0 MiB 0.08 ms
Input props
[
  "createdAt" => DateTimeImmutable @1693906684 {#4283
    date: 2023-09-05 11:38:04.0 +02:00
  }
  "editedAt" => null
]
Attributes
[]
Component
App\Twig\Components\DateEditedComponent {#6530
  +createdAt: DateTimeImmutable @1693906684 {#4283
    date: 2023-09-05 11:38:04.0 +02:00
  }
  +editedAt: null
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 0.14 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  "width" => 40
  "height" => 40
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#6584
  +width: 40
  +height: 40
  +user: Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +asLink: true
}
vote App\Twig\Components\VoteComponent 14.0 MiB 0.47 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4284
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4105
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: """
        I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
        \n
        You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
        \n
        And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1694071778 {#4106
        date: 2023-09-07 09:29:38.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4103 …}
      +nested: Doctrine\ORM\PersistentCollection {#4101 …}
      +votes: Doctrine\ORM\PersistentCollection {#4099 …}
      +reports: Doctrine\ORM\PersistentCollection {#4096 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
      -id: 27597
      -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2572674"
      +editedAt: DateTimeImmutable @1693564680 {#4111
        date: 2023-09-01 12:38:00.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693564547 {#4109
        date: 2023-09-01 12:35:47.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
      \n
      I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906684 {#4282
      date: 2023-09-05 11:38:04.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4285 …}
    +nested: Doctrine\ORM\PersistentCollection {#4287 …}
    +votes: Doctrine\ORM\PersistentCollection {#4289 …}
    +reports: Doctrine\ORM\PersistentCollection {#4291 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
    -id: 28063
    -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212522"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906684 {#4283
      date: 2023-09-05 11:38:04.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\VoteComponent {#6663
  +subject: App\Entity\EntryComment {#4284
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4105
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: """
        I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
        \n
        You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
        \n
        And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1694071778 {#4106
        date: 2023-09-07 09:29:38.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4103 …}
      +nested: Doctrine\ORM\PersistentCollection {#4101 …}
      +votes: Doctrine\ORM\PersistentCollection {#4099 …}
      +reports: Doctrine\ORM\PersistentCollection {#4096 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
      -id: 27597
      -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2572674"
      +editedAt: DateTimeImmutable @1693564680 {#4111
        date: 2023-09-01 12:38:00.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693564547 {#4109
        date: 2023-09-01 12:35:47.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
      \n
      I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906684 {#4282
      date: 2023-09-05 11:38:04.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4285 …}
    +nested: Doctrine\ORM\PersistentCollection {#4287 …}
    +votes: Doctrine\ORM\PersistentCollection {#4289 …}
    +reports: Doctrine\ORM\PersistentCollection {#4291 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
    -id: 28063
    -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212522"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906684 {#4283
      date: 2023-09-05 11:38:04.0 +02:00
    }
  }
  +formDest: "entry_comment"
  +showDownvote: true
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
boost App\Twig\Components\BoostComponent 14.0 MiB 2.61 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4284
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4105
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: """
        I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
        \n
        You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
        \n
        And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1694071778 {#4106
        date: 2023-09-07 09:29:38.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4103 …}
      +nested: Doctrine\ORM\PersistentCollection {#4101 …}
      +votes: Doctrine\ORM\PersistentCollection {#4099 …}
      +reports: Doctrine\ORM\PersistentCollection {#4096 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
      -id: 27597
      -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2572674"
      +editedAt: DateTimeImmutable @1693564680 {#4111
        date: 2023-09-01 12:38:00.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693564547 {#4109
        date: 2023-09-01 12:35:47.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
      \n
      I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906684 {#4282
      date: 2023-09-05 11:38:04.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4285 …}
    +nested: Doctrine\ORM\PersistentCollection {#4287 …}
    +votes: Doctrine\ORM\PersistentCollection {#4289 …}
    +reports: Doctrine\ORM\PersistentCollection {#4291 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
    -id: 28063
    -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212522"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906684 {#4283
      date: 2023-09-05 11:38:04.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\BoostComponent {#6720
  +formDest: "entry_comment"
  +subject: App\Entity\EntryComment {#4284
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4105
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: """
        I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
        \n
        You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
        \n
        And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1694071778 {#4106
        date: 2023-09-07 09:29:38.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4103 …}
      +nested: Doctrine\ORM\PersistentCollection {#4101 …}
      +votes: Doctrine\ORM\PersistentCollection {#4099 …}
      +reports: Doctrine\ORM\PersistentCollection {#4096 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
      -id: 27597
      -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2572674"
      +editedAt: DateTimeImmutable @1693564680 {#4111
        date: 2023-09-01 12:38:00.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693564547 {#4109
        date: 2023-09-01 12:35:47.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
      \n
      I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906684 {#4282
      date: 2023-09-05 11:38:04.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4285 …}
    +nested: Doctrine\ORM\PersistentCollection {#4287 …}
    +votes: Doctrine\ORM\PersistentCollection {#4289 …}
    +reports: Doctrine\ORM\PersistentCollection {#4291 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
    -id: 28063
    -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212522"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906684 {#4283
      date: 2023-09-05 11:38:04.0 +02:00
    }
  }
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
entry_comments_nested App\Twig\Components\EntryCommentsNestedComponent 14.0 MiB 36.67 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4284
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4105
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: """
        I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
        \n
        You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
        \n
        And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1694071778 {#4106
        date: 2023-09-07 09:29:38.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4103 …}
      +nested: Doctrine\ORM\PersistentCollection {#4101 …}
      +votes: Doctrine\ORM\PersistentCollection {#4099 …}
      +reports: Doctrine\ORM\PersistentCollection {#4096 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
      -id: 27597
      -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2572674"
      +editedAt: DateTimeImmutable @1693564680 {#4111
        date: 2023-09-01 12:38:00.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693564547 {#4109
        date: 2023-09-01 12:35:47.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
      \n
      I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906684 {#4282
      date: 2023-09-05 11:38:04.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4285 …}
    +nested: Doctrine\ORM\PersistentCollection {#4287 …}
    +votes: Doctrine\ORM\PersistentCollection {#4289 …}
    +reports: Doctrine\ORM\PersistentCollection {#4291 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
    -id: 28063
    -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212522"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906684 {#4283
      date: 2023-09-05 11:38:04.0 +02:00
    }
  }
  "level" => 2
  "showNested" => true
  "view" => "tree"
]
Attributes
[
  "showNested" => true
]
Component
App\Twig\Components\EntryCommentsNestedComponent {#6960
  +comment: App\Entity\EntryComment {#4284
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4105
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: """
        I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
        \n
        You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
        \n
        And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1694071778 {#4106
        date: 2023-09-07 09:29:38.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4103 …}
      +nested: Doctrine\ORM\PersistentCollection {#4101 …}
      +votes: Doctrine\ORM\PersistentCollection {#4099 …}
      +reports: Doctrine\ORM\PersistentCollection {#4096 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
      -id: 27597
      -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2572674"
      +editedAt: DateTimeImmutable @1693564680 {#4111
        date: 2023-09-01 12:38:00.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693564547 {#4109
        date: 2023-09-01 12:35:47.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
      \n
      I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906684 {#4282
      date: 2023-09-05 11:38:04.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4285 …}
    +nested: Doctrine\ORM\PersistentCollection {#4287 …}
    +votes: Doctrine\ORM\PersistentCollection {#4289 …}
    +reports: Doctrine\ORM\PersistentCollection {#4291 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
    -id: 28063
    -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212522"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906684 {#4283
      date: 2023-09-05 11:38:04.0 +02:00
    }
  }
  +nestedComments: []
  +level: 2
  +view: "tree"
  -entryCommentRepository: App\Repository\EntryCommentRepository {#557 …}
  -twig: Twig\Environment {#1252 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
entry_comment App\Twig\Components\EntryCommentComponent 14.0 MiB 35.74 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4319
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4284
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4105
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: null
        +root: null
        +body: """
          I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
          \n
          You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
          \n
          And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1694071778 {#4106
          date: 2023-09-07 09:29:38.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4103 …}
        +nested: Doctrine\ORM\PersistentCollection {#4101 …}
        +votes: Doctrine\ORM\PersistentCollection {#4099 …}
        +reports: Doctrine\ORM\PersistentCollection {#4096 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
        -id: 27597
        -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2572674"
        +editedAt: DateTimeImmutable @1693564680 {#4111
          date: 2023-09-01 12:38:00.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693564547 {#4109
          date: 2023-09-01 12:35:47.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
        \n
        I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906684 {#4282
        date: 2023-09-05 11:38:04.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4285 …}
      +nested: Doctrine\ORM\PersistentCollection {#4287 …}
      +votes: Doctrine\ORM\PersistentCollection {#4289 …}
      +reports: Doctrine\ORM\PersistentCollection {#4291 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
      -id: 28063
      -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/212522"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693906684 {#4283
        date: 2023-09-05 11:38:04.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
      \n
      Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
      \n
      Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
      \n
      Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
      \n
      If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
      \n
      I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693914344 {#4323
      date: 2023-09-05 13:45:44.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4316 …}
    +nested: Doctrine\ORM\PersistentCollection {#4314 …}
    +votes: Doctrine\ORM\PersistentCollection {#4318 …}
    +reports: Doctrine\ORM\PersistentCollection {#4329 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
    -id: 28065
    -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2687935"
    +editedAt: DateTimeImmutable @1693914611 {#4326
      date: 2023-09-05 13:50:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693914344 {#4322
      date: 2023-09-05 13:45:44.0 +02:00
    }
  }
  "showNested" => true
  "level" => 3
  "showEntryTitle" => false
  "showMagazineName" => false
]
Attributes
[]
Component
App\Twig\Components\EntryCommentComponent {#7015
  +comment: App\Entity\EntryComment {#4319
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4284
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4105
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: null
        +root: null
        +body: """
          I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
          \n
          You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
          \n
          And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1694071778 {#4106
          date: 2023-09-07 09:29:38.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4103 …}
        +nested: Doctrine\ORM\PersistentCollection {#4101 …}
        +votes: Doctrine\ORM\PersistentCollection {#4099 …}
        +reports: Doctrine\ORM\PersistentCollection {#4096 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
        -id: 27597
        -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2572674"
        +editedAt: DateTimeImmutable @1693564680 {#4111
          date: 2023-09-01 12:38:00.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693564547 {#4109
          date: 2023-09-01 12:35:47.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
        \n
        I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906684 {#4282
        date: 2023-09-05 11:38:04.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4285 …}
      +nested: Doctrine\ORM\PersistentCollection {#4287 …}
      +votes: Doctrine\ORM\PersistentCollection {#4289 …}
      +reports: Doctrine\ORM\PersistentCollection {#4291 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
      -id: 28063
      -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/212522"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693906684 {#4283
        date: 2023-09-05 11:38:04.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
      \n
      Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
      \n
      Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
      \n
      Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
      \n
      If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
      \n
      I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693914344 {#4323
      date: 2023-09-05 13:45:44.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4316 …}
    +nested: Doctrine\ORM\PersistentCollection {#4314 …}
    +votes: Doctrine\ORM\PersistentCollection {#4318 …}
    +reports: Doctrine\ORM\PersistentCollection {#4329 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
    -id: 28065
    -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2687935"
    +editedAt: DateTimeImmutable @1693914611 {#4326
      date: 2023-09-05 13:50:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693914344 {#4322
      date: 2023-09-05 13:45:44.0 +02:00
    }
  }
  +showMagazineName: false
  +showEntryTitle: false
  +showNested: true
  +level: 3
  +canSeeTrash: false
  +dateAsUrl: false
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -authorizationChecker: Symfony\Component\Security\Core\Authorization\AuthorizationChecker {#931 …}
}
user_inline App\Twig\Components\UserInlineComponent 14.0 MiB 0.12 ms
Input props
[
  "user" => App\Entity\User {#4088
    +avatar: null
    +cover: null
    +email: "rufus@discuss.tchncs.de"
    +username: "@rufus@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1729234169 {#4110
      date: 2024-10-18 08:49:29.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
    +entries: Doctrine\ORM\PersistentCollection {#4081 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
    +posts: Doctrine\ORM\PersistentCollection {#4141 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
    +follows: Doctrine\ORM\PersistentCollection {#4153 …}
    +followers: Doctrine\ORM\PersistentCollection {#4155 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
    +reports: Doctrine\ORM\PersistentCollection {#4165 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
    +violations: Doctrine\ORM\PersistentCollection {#4169 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
    +awards: Doctrine\ORM\PersistentCollection {#4173 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
    +categories: Doctrine\ORM\PersistentCollection {#4177 …}
    -id: 22773
    -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
    +apId: "rufus@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/rufus"
    +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "rufus"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728254912 {#4107
      date: 2024-10-07 00:48:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689082128 {#4100
      date: 2023-07-11 15:28:48.0 +02:00
    }
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#7060
  +user: App\Entity\User {#4088
    +avatar: null
    +cover: null
    +email: "rufus@discuss.tchncs.de"
    +username: "@rufus@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1729234169 {#4110
      date: 2024-10-18 08:49:29.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
    +entries: Doctrine\ORM\PersistentCollection {#4081 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
    +posts: Doctrine\ORM\PersistentCollection {#4141 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
    +follows: Doctrine\ORM\PersistentCollection {#4153 …}
    +followers: Doctrine\ORM\PersistentCollection {#4155 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
    +reports: Doctrine\ORM\PersistentCollection {#4165 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
    +violations: Doctrine\ORM\PersistentCollection {#4169 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
    +awards: Doctrine\ORM\PersistentCollection {#4173 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
    +categories: Doctrine\ORM\PersistentCollection {#4177 …}
    -id: 22773
    -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
    +apId: "rufus@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/rufus"
    +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "rufus"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728254912 {#4107
      date: 2024-10-07 00:48:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689082128 {#4100
      date: 2023-07-11 15:28:48.0 +02:00
    }
  }
  +showAvatar: false
}
date App\Twig\Components\DateComponent 14.0 MiB 0.12 ms
Input props
[
  "date" => DateTimeImmutable @1693914344 {#4322
    date: 2023-09-05 13:45:44.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#7115
  +date: DateTimeImmutable @1693914344 {#4322
    date: 2023-09-05 13:45:44.0 +02:00
  }
}
date_edited App\Twig\Components\DateEditedComponent 14.0 MiB 0.09 ms
Input props
[
  "createdAt" => DateTimeImmutable @1693914344 {#4322
    date: 2023-09-05 13:45:44.0 +02:00
  }
  "editedAt" => DateTimeImmutable @1693914611 {#4326
    date: 2023-09-05 13:50:11.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateEditedComponent {#7169
  +createdAt: DateTimeImmutable @1693914344 {#4322
    date: 2023-09-05 13:45:44.0 +02:00
  }
  +editedAt: DateTimeImmutable @1693914611 {#4326
    date: 2023-09-05 13:50:11.0 +02:00
  }
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 0.15 ms
Input props
[
  "user" => App\Entity\User {#4088
    +avatar: null
    +cover: null
    +email: "rufus@discuss.tchncs.de"
    +username: "@rufus@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1729234169 {#4110
      date: 2024-10-18 08:49:29.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
    +entries: Doctrine\ORM\PersistentCollection {#4081 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
    +posts: Doctrine\ORM\PersistentCollection {#4141 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
    +follows: Doctrine\ORM\PersistentCollection {#4153 …}
    +followers: Doctrine\ORM\PersistentCollection {#4155 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
    +reports: Doctrine\ORM\PersistentCollection {#4165 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
    +violations: Doctrine\ORM\PersistentCollection {#4169 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
    +awards: Doctrine\ORM\PersistentCollection {#4173 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
    +categories: Doctrine\ORM\PersistentCollection {#4177 …}
    -id: 22773
    -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
    +apId: "rufus@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/rufus"
    +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "rufus"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728254912 {#4107
      date: 2024-10-07 00:48:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689082128 {#4100
      date: 2023-07-11 15:28:48.0 +02:00
    }
  }
  "width" => 40
  "height" => 40
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#7223
  +width: 40
  +height: 40
  +user: App\Entity\User {#4088
    +avatar: null
    +cover: null
    +email: "rufus@discuss.tchncs.de"
    +username: "@rufus@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1729234169 {#4110
      date: 2024-10-18 08:49:29.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
    +entries: Doctrine\ORM\PersistentCollection {#4081 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
    +posts: Doctrine\ORM\PersistentCollection {#4141 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
    +follows: Doctrine\ORM\PersistentCollection {#4153 …}
    +followers: Doctrine\ORM\PersistentCollection {#4155 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
    +reports: Doctrine\ORM\PersistentCollection {#4165 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
    +violations: Doctrine\ORM\PersistentCollection {#4169 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
    +awards: Doctrine\ORM\PersistentCollection {#4173 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
    +categories: Doctrine\ORM\PersistentCollection {#4177 …}
    -id: 22773
    -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
    +apId: "rufus@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/rufus"
    +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "rufus"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728254912 {#4107
      date: 2024-10-07 00:48:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689082128 {#4100
      date: 2023-07-11 15:28:48.0 +02:00
    }
  }
  +asLink: true
}
vote App\Twig\Components\VoteComponent 14.0 MiB 0.48 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4319
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4284
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4105
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: null
        +root: null
        +body: """
          I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
          \n
          You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
          \n
          And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1694071778 {#4106
          date: 2023-09-07 09:29:38.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4103 …}
        +nested: Doctrine\ORM\PersistentCollection {#4101 …}
        +votes: Doctrine\ORM\PersistentCollection {#4099 …}
        +reports: Doctrine\ORM\PersistentCollection {#4096 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
        -id: 27597
        -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2572674"
        +editedAt: DateTimeImmutable @1693564680 {#4111
          date: 2023-09-01 12:38:00.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693564547 {#4109
          date: 2023-09-01 12:35:47.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
        \n
        I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906684 {#4282
        date: 2023-09-05 11:38:04.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4285 …}
      +nested: Doctrine\ORM\PersistentCollection {#4287 …}
      +votes: Doctrine\ORM\PersistentCollection {#4289 …}
      +reports: Doctrine\ORM\PersistentCollection {#4291 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
      -id: 28063
      -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/212522"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693906684 {#4283
        date: 2023-09-05 11:38:04.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
      \n
      Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
      \n
      Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
      \n
      Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
      \n
      If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
      \n
      I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693914344 {#4323
      date: 2023-09-05 13:45:44.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4316 …}
    +nested: Doctrine\ORM\PersistentCollection {#4314 …}
    +votes: Doctrine\ORM\PersistentCollection {#4318 …}
    +reports: Doctrine\ORM\PersistentCollection {#4329 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
    -id: 28065
    -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2687935"
    +editedAt: DateTimeImmutable @1693914611 {#4326
      date: 2023-09-05 13:50:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693914344 {#4322
      date: 2023-09-05 13:45:44.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\VoteComponent {#7312
  +subject: App\Entity\EntryComment {#4319
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4284
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4105
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: null
        +root: null
        +body: """
          I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
          \n
          You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
          \n
          And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1694071778 {#4106
          date: 2023-09-07 09:29:38.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4103 …}
        +nested: Doctrine\ORM\PersistentCollection {#4101 …}
        +votes: Doctrine\ORM\PersistentCollection {#4099 …}
        +reports: Doctrine\ORM\PersistentCollection {#4096 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
        -id: 27597
        -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2572674"
        +editedAt: DateTimeImmutable @1693564680 {#4111
          date: 2023-09-01 12:38:00.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693564547 {#4109
          date: 2023-09-01 12:35:47.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
        \n
        I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906684 {#4282
        date: 2023-09-05 11:38:04.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4285 …}
      +nested: Doctrine\ORM\PersistentCollection {#4287 …}
      +votes: Doctrine\ORM\PersistentCollection {#4289 …}
      +reports: Doctrine\ORM\PersistentCollection {#4291 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
      -id: 28063
      -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/212522"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693906684 {#4283
        date: 2023-09-05 11:38:04.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
      \n
      Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
      \n
      Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
      \n
      Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
      \n
      If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
      \n
      I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693914344 {#4323
      date: 2023-09-05 13:45:44.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4316 …}
    +nested: Doctrine\ORM\PersistentCollection {#4314 …}
    +votes: Doctrine\ORM\PersistentCollection {#4318 …}
    +reports: Doctrine\ORM\PersistentCollection {#4329 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
    -id: 28065
    -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2687935"
    +editedAt: DateTimeImmutable @1693914611 {#4326
      date: 2023-09-05 13:50:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693914344 {#4322
      date: 2023-09-05 13:45:44.0 +02:00
    }
  }
  +formDest: "entry_comment"
  +showDownvote: true
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
boost App\Twig\Components\BoostComponent 14.0 MiB 2.95 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4319
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4284
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4105
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: null
        +root: null
        +body: """
          I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
          \n
          You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
          \n
          And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1694071778 {#4106
          date: 2023-09-07 09:29:38.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4103 …}
        +nested: Doctrine\ORM\PersistentCollection {#4101 …}
        +votes: Doctrine\ORM\PersistentCollection {#4099 …}
        +reports: Doctrine\ORM\PersistentCollection {#4096 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
        -id: 27597
        -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2572674"
        +editedAt: DateTimeImmutable @1693564680 {#4111
          date: 2023-09-01 12:38:00.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693564547 {#4109
          date: 2023-09-01 12:35:47.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
        \n
        I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906684 {#4282
        date: 2023-09-05 11:38:04.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4285 …}
      +nested: Doctrine\ORM\PersistentCollection {#4287 …}
      +votes: Doctrine\ORM\PersistentCollection {#4289 …}
      +reports: Doctrine\ORM\PersistentCollection {#4291 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
      -id: 28063
      -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/212522"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693906684 {#4283
        date: 2023-09-05 11:38:04.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
      \n
      Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
      \n
      Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
      \n
      Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
      \n
      If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
      \n
      I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693914344 {#4323
      date: 2023-09-05 13:45:44.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4316 …}
    +nested: Doctrine\ORM\PersistentCollection {#4314 …}
    +votes: Doctrine\ORM\PersistentCollection {#4318 …}
    +reports: Doctrine\ORM\PersistentCollection {#4329 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
    -id: 28065
    -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2687935"
    +editedAt: DateTimeImmutable @1693914611 {#4326
      date: 2023-09-05 13:50:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693914344 {#4322
      date: 2023-09-05 13:45:44.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\BoostComponent {#7369
  +formDest: "entry_comment"
  +subject: App\Entity\EntryComment {#4319
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4284
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4105
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: null
        +root: null
        +body: """
          I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
          \n
          You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
          \n
          And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1694071778 {#4106
          date: 2023-09-07 09:29:38.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4103 …}
        +nested: Doctrine\ORM\PersistentCollection {#4101 …}
        +votes: Doctrine\ORM\PersistentCollection {#4099 …}
        +reports: Doctrine\ORM\PersistentCollection {#4096 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
        -id: 27597
        -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2572674"
        +editedAt: DateTimeImmutable @1693564680 {#4111
          date: 2023-09-01 12:38:00.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693564547 {#4109
          date: 2023-09-01 12:35:47.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
        \n
        I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906684 {#4282
        date: 2023-09-05 11:38:04.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4285 …}
      +nested: Doctrine\ORM\PersistentCollection {#4287 …}
      +votes: Doctrine\ORM\PersistentCollection {#4289 …}
      +reports: Doctrine\ORM\PersistentCollection {#4291 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
      -id: 28063
      -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/212522"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693906684 {#4283
        date: 2023-09-05 11:38:04.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
      \n
      Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
      \n
      Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
      \n
      Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
      \n
      If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
      \n
      I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693914344 {#4323
      date: 2023-09-05 13:45:44.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4316 …}
    +nested: Doctrine\ORM\PersistentCollection {#4314 …}
    +votes: Doctrine\ORM\PersistentCollection {#4318 …}
    +reports: Doctrine\ORM\PersistentCollection {#4329 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
    -id: 28065
    -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2687935"
    +editedAt: DateTimeImmutable @1693914611 {#4326
      date: 2023-09-05 13:50:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693914344 {#4322
      date: 2023-09-05 13:45:44.0 +02:00
    }
  }
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
entry_comments_nested App\Twig\Components\EntryCommentsNestedComponent 14.0 MiB 27.60 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4319
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4284
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4105
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: null
        +root: null
        +body: """
          I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
          \n
          You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
          \n
          And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1694071778 {#4106
          date: 2023-09-07 09:29:38.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4103 …}
        +nested: Doctrine\ORM\PersistentCollection {#4101 …}
        +votes: Doctrine\ORM\PersistentCollection {#4099 …}
        +reports: Doctrine\ORM\PersistentCollection {#4096 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
        -id: 27597
        -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2572674"
        +editedAt: DateTimeImmutable @1693564680 {#4111
          date: 2023-09-01 12:38:00.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693564547 {#4109
          date: 2023-09-01 12:35:47.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
        \n
        I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906684 {#4282
        date: 2023-09-05 11:38:04.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4285 …}
      +nested: Doctrine\ORM\PersistentCollection {#4287 …}
      +votes: Doctrine\ORM\PersistentCollection {#4289 …}
      +reports: Doctrine\ORM\PersistentCollection {#4291 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
      -id: 28063
      -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/212522"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693906684 {#4283
        date: 2023-09-05 11:38:04.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
      \n
      Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
      \n
      Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
      \n
      Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
      \n
      If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
      \n
      I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693914344 {#4323
      date: 2023-09-05 13:45:44.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4316 …}
    +nested: Doctrine\ORM\PersistentCollection {#4314 …}
    +votes: Doctrine\ORM\PersistentCollection {#4318 …}
    +reports: Doctrine\ORM\PersistentCollection {#4329 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
    -id: 28065
    -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2687935"
    +editedAt: DateTimeImmutable @1693914611 {#4326
      date: 2023-09-05 13:50:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693914344 {#4322
      date: 2023-09-05 13:45:44.0 +02:00
    }
  }
  "level" => 3
  "showNested" => true
  "view" => "tree"
]
Attributes
[
  "showNested" => true
]
Component
App\Twig\Components\EntryCommentsNestedComponent {#7257
  +comment: App\Entity\EntryComment {#4319
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4284
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4105
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: null
        +root: null
        +body: """
          I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
          \n
          You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
          \n
          And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1694071778 {#4106
          date: 2023-09-07 09:29:38.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4103 …}
        +nested: Doctrine\ORM\PersistentCollection {#4101 …}
        +votes: Doctrine\ORM\PersistentCollection {#4099 …}
        +reports: Doctrine\ORM\PersistentCollection {#4096 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
        -id: 27597
        -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2572674"
        +editedAt: DateTimeImmutable @1693564680 {#4111
          date: 2023-09-01 12:38:00.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693564547 {#4109
          date: 2023-09-01 12:35:47.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
        \n
        I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906684 {#4282
        date: 2023-09-05 11:38:04.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4285 …}
      +nested: Doctrine\ORM\PersistentCollection {#4287 …}
      +votes: Doctrine\ORM\PersistentCollection {#4289 …}
      +reports: Doctrine\ORM\PersistentCollection {#4291 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
      -id: 28063
      -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/212522"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693906684 {#4283
        date: 2023-09-05 11:38:04.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
      \n
      Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
      \n
      Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
      \n
      Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
      \n
      If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
      \n
      I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693914344 {#4323
      date: 2023-09-05 13:45:44.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4316 …}
    +nested: Doctrine\ORM\PersistentCollection {#4314 …}
    +votes: Doctrine\ORM\PersistentCollection {#4318 …}
    +reports: Doctrine\ORM\PersistentCollection {#4329 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
    -id: 28065
    -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2687935"
    +editedAt: DateTimeImmutable @1693914611 {#4326
      date: 2023-09-05 13:50:11.0 +02:00
    }
    +createdAt: DateTimeImmutable @1693914344 {#4322
      date: 2023-09-05 13:45:44.0 +02:00
    }
  }
  +nestedComments: []
  +level: 3
  +view: "tree"
  -entryCommentRepository: App\Repository\EntryCommentRepository {#557 …}
  -twig: Twig\Environment {#1252 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
entry_comment App\Twig\Components\EntryCommentComponent 14.0 MiB 26.62 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4350
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4319
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4284
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4105
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: null
          +root: null
          +body: """
            I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
            \n
            You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
            \n
            And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1694071778 {#4106
            date: 2023-09-07 09:29:38.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4103 …}
          +nested: Doctrine\ORM\PersistentCollection {#4101 …}
          +votes: Doctrine\ORM\PersistentCollection {#4099 …}
          +reports: Doctrine\ORM\PersistentCollection {#4096 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
          -id: 27597
          -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2572674"
          +editedAt: DateTimeImmutable @1693564680 {#4111
            date: 2023-09-01 12:38:00.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693564547 {#4109
            date: 2023-09-01 12:35:47.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
          \n
          I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693906684 {#4282
          date: 2023-09-05 11:38:04.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4285 …}
        +nested: Doctrine\ORM\PersistentCollection {#4287 …}
        +votes: Doctrine\ORM\PersistentCollection {#4289 …}
        +reports: Doctrine\ORM\PersistentCollection {#4291 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
        -id: 28063
        -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/212522"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693906684 {#4283
          date: 2023-09-05 11:38:04.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
        \n
        Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
        \n
        Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
        \n
        Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
        \n
        If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
        \n
        I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693914344 {#4323
        date: 2023-09-05 13:45:44.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4316 …}
      +nested: Doctrine\ORM\PersistentCollection {#4314 …}
      +votes: Doctrine\ORM\PersistentCollection {#4318 …}
      +reports: Doctrine\ORM\PersistentCollection {#4329 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
      -id: 28065
      -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2687935"
      +editedAt: DateTimeImmutable @1693914611 {#4326
        date: 2023-09-05 13:50:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693914344 {#4322
        date: 2023-09-05 13:45:44.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
      \n
      I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
      \n
      I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
      \n
      Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693974973 {#4345
      date: 2023-09-06 06:36:13.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4342 …}
    +nested: Doctrine\ORM\PersistentCollection {#4339 …}
    +votes: Doctrine\ORM\PersistentCollection {#4337 …}
    +reports: Doctrine\ORM\PersistentCollection {#4351 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
    -id: 28109
    -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/213919"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693974973 {#4348
      date: 2023-09-06 06:36:13.0 +02:00
    }
  }
  "showNested" => true
  "level" => 4
  "showEntryTitle" => false
  "showMagazineName" => false
]
Attributes
[]
Component
App\Twig\Components\EntryCommentComponent {#7447
  +comment: App\Entity\EntryComment {#4350
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4319
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4284
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4105
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: null
          +root: null
          +body: """
            I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
            \n
            You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
            \n
            And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1694071778 {#4106
            date: 2023-09-07 09:29:38.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4103 …}
          +nested: Doctrine\ORM\PersistentCollection {#4101 …}
          +votes: Doctrine\ORM\PersistentCollection {#4099 …}
          +reports: Doctrine\ORM\PersistentCollection {#4096 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
          -id: 27597
          -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2572674"
          +editedAt: DateTimeImmutable @1693564680 {#4111
            date: 2023-09-01 12:38:00.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693564547 {#4109
            date: 2023-09-01 12:35:47.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
          \n
          I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693906684 {#4282
          date: 2023-09-05 11:38:04.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4285 …}
        +nested: Doctrine\ORM\PersistentCollection {#4287 …}
        +votes: Doctrine\ORM\PersistentCollection {#4289 …}
        +reports: Doctrine\ORM\PersistentCollection {#4291 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
        -id: 28063
        -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/212522"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693906684 {#4283
          date: 2023-09-05 11:38:04.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
        \n
        Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
        \n
        Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
        \n
        Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
        \n
        If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
        \n
        I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693914344 {#4323
        date: 2023-09-05 13:45:44.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4316 …}
      +nested: Doctrine\ORM\PersistentCollection {#4314 …}
      +votes: Doctrine\ORM\PersistentCollection {#4318 …}
      +reports: Doctrine\ORM\PersistentCollection {#4329 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
      -id: 28065
      -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2687935"
      +editedAt: DateTimeImmutable @1693914611 {#4326
        date: 2023-09-05 13:50:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693914344 {#4322
        date: 2023-09-05 13:45:44.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
      \n
      I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
      \n
      I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
      \n
      Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693974973 {#4345
      date: 2023-09-06 06:36:13.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4342 …}
    +nested: Doctrine\ORM\PersistentCollection {#4339 …}
    +votes: Doctrine\ORM\PersistentCollection {#4337 …}
    +reports: Doctrine\ORM\PersistentCollection {#4351 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
    -id: 28109
    -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/213919"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693974973 {#4348
      date: 2023-09-06 06:36:13.0 +02:00
    }
  }
  +showMagazineName: false
  +showEntryTitle: false
  +showNested: true
  +level: 4
  +canSeeTrash: false
  +dateAsUrl: false
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -authorizationChecker: Symfony\Component\Security\Core\Authorization\AuthorizationChecker {#931 …}
}
user_inline App\Twig\Components\UserInlineComponent 14.0 MiB 0.14 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#7492
  +user: Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +showAvatar: false
}
date App\Twig\Components\DateComponent 14.0 MiB 0.13 ms
Input props
[
  "date" => DateTimeImmutable @1693974973 {#4348
    date: 2023-09-06 06:36:13.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#7547
  +date: DateTimeImmutable @1693974973 {#4348
    date: 2023-09-06 06:36:13.0 +02:00
  }
}
date_edited App\Twig\Components\DateEditedComponent 14.0 MiB 0.09 ms
Input props
[
  "createdAt" => DateTimeImmutable @1693974973 {#4348
    date: 2023-09-06 06:36:13.0 +02:00
  }
  "editedAt" => null
]
Attributes
[]
Component
App\Twig\Components\DateEditedComponent {#7601
  +createdAt: DateTimeImmutable @1693974973 {#4348
    date: 2023-09-06 06:36:13.0 +02:00
  }
  +editedAt: null
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 0.13 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  "width" => 40
  "height" => 40
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#7655
  +width: 40
  +height: 40
  +user: Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +asLink: true
}
vote App\Twig\Components\VoteComponent 14.0 MiB 0.77 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4350
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4319
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4284
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4105
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: null
          +root: null
          +body: """
            I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
            \n
            You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
            \n
            And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1694071778 {#4106
            date: 2023-09-07 09:29:38.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4103 …}
          +nested: Doctrine\ORM\PersistentCollection {#4101 …}
          +votes: Doctrine\ORM\PersistentCollection {#4099 …}
          +reports: Doctrine\ORM\PersistentCollection {#4096 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
          -id: 27597
          -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2572674"
          +editedAt: DateTimeImmutable @1693564680 {#4111
            date: 2023-09-01 12:38:00.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693564547 {#4109
            date: 2023-09-01 12:35:47.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
          \n
          I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693906684 {#4282
          date: 2023-09-05 11:38:04.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4285 …}
        +nested: Doctrine\ORM\PersistentCollection {#4287 …}
        +votes: Doctrine\ORM\PersistentCollection {#4289 …}
        +reports: Doctrine\ORM\PersistentCollection {#4291 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
        -id: 28063
        -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/212522"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693906684 {#4283
          date: 2023-09-05 11:38:04.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
        \n
        Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
        \n
        Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
        \n
        Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
        \n
        If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
        \n
        I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693914344 {#4323
        date: 2023-09-05 13:45:44.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4316 …}
      +nested: Doctrine\ORM\PersistentCollection {#4314 …}
      +votes: Doctrine\ORM\PersistentCollection {#4318 …}
      +reports: Doctrine\ORM\PersistentCollection {#4329 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
      -id: 28065
      -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2687935"
      +editedAt: DateTimeImmutable @1693914611 {#4326
        date: 2023-09-05 13:50:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693914344 {#4322
        date: 2023-09-05 13:45:44.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
      \n
      I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
      \n
      I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
      \n
      Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693974973 {#4345
      date: 2023-09-06 06:36:13.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4342 …}
    +nested: Doctrine\ORM\PersistentCollection {#4339 …}
    +votes: Doctrine\ORM\PersistentCollection {#4337 …}
    +reports: Doctrine\ORM\PersistentCollection {#4351 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
    -id: 28109
    -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/213919"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693974973 {#4348
      date: 2023-09-06 06:36:13.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\VoteComponent {#7742
  +subject: App\Entity\EntryComment {#4350
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4319
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4284
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4105
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: null
          +root: null
          +body: """
            I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
            \n
            You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
            \n
            And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1694071778 {#4106
            date: 2023-09-07 09:29:38.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4103 …}
          +nested: Doctrine\ORM\PersistentCollection {#4101 …}
          +votes: Doctrine\ORM\PersistentCollection {#4099 …}
          +reports: Doctrine\ORM\PersistentCollection {#4096 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
          -id: 27597
          -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2572674"
          +editedAt: DateTimeImmutable @1693564680 {#4111
            date: 2023-09-01 12:38:00.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693564547 {#4109
            date: 2023-09-01 12:35:47.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
          \n
          I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693906684 {#4282
          date: 2023-09-05 11:38:04.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4285 …}
        +nested: Doctrine\ORM\PersistentCollection {#4287 …}
        +votes: Doctrine\ORM\PersistentCollection {#4289 …}
        +reports: Doctrine\ORM\PersistentCollection {#4291 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
        -id: 28063
        -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/212522"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693906684 {#4283
          date: 2023-09-05 11:38:04.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
        \n
        Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
        \n
        Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
        \n
        Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
        \n
        If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
        \n
        I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693914344 {#4323
        date: 2023-09-05 13:45:44.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4316 …}
      +nested: Doctrine\ORM\PersistentCollection {#4314 …}
      +votes: Doctrine\ORM\PersistentCollection {#4318 …}
      +reports: Doctrine\ORM\PersistentCollection {#4329 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
      -id: 28065
      -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2687935"
      +editedAt: DateTimeImmutable @1693914611 {#4326
        date: 2023-09-05 13:50:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693914344 {#4322
        date: 2023-09-05 13:45:44.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
      \n
      I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
      \n
      I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
      \n
      Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693974973 {#4345
      date: 2023-09-06 06:36:13.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4342 …}
    +nested: Doctrine\ORM\PersistentCollection {#4339 …}
    +votes: Doctrine\ORM\PersistentCollection {#4337 …}
    +reports: Doctrine\ORM\PersistentCollection {#4351 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
    -id: 28109
    -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/213919"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693974973 {#4348
      date: 2023-09-06 06:36:13.0 +02:00
    }
  }
  +formDest: "entry_comment"
  +showDownvote: true
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
boost App\Twig\Components\BoostComponent 14.0 MiB 4.08 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4350
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4319
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4284
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4105
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: null
          +root: null
          +body: """
            I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
            \n
            You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
            \n
            And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1694071778 {#4106
            date: 2023-09-07 09:29:38.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4103 …}
          +nested: Doctrine\ORM\PersistentCollection {#4101 …}
          +votes: Doctrine\ORM\PersistentCollection {#4099 …}
          +reports: Doctrine\ORM\PersistentCollection {#4096 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
          -id: 27597
          -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2572674"
          +editedAt: DateTimeImmutable @1693564680 {#4111
            date: 2023-09-01 12:38:00.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693564547 {#4109
            date: 2023-09-01 12:35:47.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
          \n
          I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693906684 {#4282
          date: 2023-09-05 11:38:04.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4285 …}
        +nested: Doctrine\ORM\PersistentCollection {#4287 …}
        +votes: Doctrine\ORM\PersistentCollection {#4289 …}
        +reports: Doctrine\ORM\PersistentCollection {#4291 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
        -id: 28063
        -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/212522"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693906684 {#4283
          date: 2023-09-05 11:38:04.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
        \n
        Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
        \n
        Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
        \n
        Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
        \n
        If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
        \n
        I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693914344 {#4323
        date: 2023-09-05 13:45:44.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4316 …}
      +nested: Doctrine\ORM\PersistentCollection {#4314 …}
      +votes: Doctrine\ORM\PersistentCollection {#4318 …}
      +reports: Doctrine\ORM\PersistentCollection {#4329 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
      -id: 28065
      -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2687935"
      +editedAt: DateTimeImmutable @1693914611 {#4326
        date: 2023-09-05 13:50:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693914344 {#4322
        date: 2023-09-05 13:45:44.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
      \n
      I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
      \n
      I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
      \n
      Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693974973 {#4345
      date: 2023-09-06 06:36:13.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4342 …}
    +nested: Doctrine\ORM\PersistentCollection {#4339 …}
    +votes: Doctrine\ORM\PersistentCollection {#4337 …}
    +reports: Doctrine\ORM\PersistentCollection {#4351 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
    -id: 28109
    -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/213919"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693974973 {#4348
      date: 2023-09-06 06:36:13.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\BoostComponent {#7799
  +formDest: "entry_comment"
  +subject: App\Entity\EntryComment {#4350
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4319
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4284
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4105
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: null
          +root: null
          +body: """
            I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
            \n
            You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
            \n
            And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1694071778 {#4106
            date: 2023-09-07 09:29:38.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4103 …}
          +nested: Doctrine\ORM\PersistentCollection {#4101 …}
          +votes: Doctrine\ORM\PersistentCollection {#4099 …}
          +reports: Doctrine\ORM\PersistentCollection {#4096 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
          -id: 27597
          -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2572674"
          +editedAt: DateTimeImmutable @1693564680 {#4111
            date: 2023-09-01 12:38:00.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693564547 {#4109
            date: 2023-09-01 12:35:47.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
          \n
          I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693906684 {#4282
          date: 2023-09-05 11:38:04.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4285 …}
        +nested: Doctrine\ORM\PersistentCollection {#4287 …}
        +votes: Doctrine\ORM\PersistentCollection {#4289 …}
        +reports: Doctrine\ORM\PersistentCollection {#4291 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
        -id: 28063
        -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/212522"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693906684 {#4283
          date: 2023-09-05 11:38:04.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
        \n
        Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
        \n
        Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
        \n
        Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
        \n
        If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
        \n
        I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693914344 {#4323
        date: 2023-09-05 13:45:44.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4316 …}
      +nested: Doctrine\ORM\PersistentCollection {#4314 …}
      +votes: Doctrine\ORM\PersistentCollection {#4318 …}
      +reports: Doctrine\ORM\PersistentCollection {#4329 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
      -id: 28065
      -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2687935"
      +editedAt: DateTimeImmutable @1693914611 {#4326
        date: 2023-09-05 13:50:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693914344 {#4322
        date: 2023-09-05 13:45:44.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
      \n
      I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
      \n
      I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
      \n
      Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693974973 {#4345
      date: 2023-09-06 06:36:13.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4342 …}
    +nested: Doctrine\ORM\PersistentCollection {#4339 …}
    +votes: Doctrine\ORM\PersistentCollection {#4337 …}
    +reports: Doctrine\ORM\PersistentCollection {#4351 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
    -id: 28109
    -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/213919"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693974973 {#4348
      date: 2023-09-06 06:36:13.0 +02:00
    }
  }
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
entry_comments_nested App\Twig\Components\EntryCommentsNestedComponent 14.0 MiB 16.34 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4350
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4319
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4284
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4105
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: null
          +root: null
          +body: """
            I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
            \n
            You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
            \n
            And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1694071778 {#4106
            date: 2023-09-07 09:29:38.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4103 …}
          +nested: Doctrine\ORM\PersistentCollection {#4101 …}
          +votes: Doctrine\ORM\PersistentCollection {#4099 …}
          +reports: Doctrine\ORM\PersistentCollection {#4096 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
          -id: 27597
          -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2572674"
          +editedAt: DateTimeImmutable @1693564680 {#4111
            date: 2023-09-01 12:38:00.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693564547 {#4109
            date: 2023-09-01 12:35:47.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
          \n
          I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693906684 {#4282
          date: 2023-09-05 11:38:04.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4285 …}
        +nested: Doctrine\ORM\PersistentCollection {#4287 …}
        +votes: Doctrine\ORM\PersistentCollection {#4289 …}
        +reports: Doctrine\ORM\PersistentCollection {#4291 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
        -id: 28063
        -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/212522"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693906684 {#4283
          date: 2023-09-05 11:38:04.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
        \n
        Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
        \n
        Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
        \n
        Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
        \n
        If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
        \n
        I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693914344 {#4323
        date: 2023-09-05 13:45:44.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4316 …}
      +nested: Doctrine\ORM\PersistentCollection {#4314 …}
      +votes: Doctrine\ORM\PersistentCollection {#4318 …}
      +reports: Doctrine\ORM\PersistentCollection {#4329 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
      -id: 28065
      -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2687935"
      +editedAt: DateTimeImmutable @1693914611 {#4326
        date: 2023-09-05 13:50:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693914344 {#4322
        date: 2023-09-05 13:45:44.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
      \n
      I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
      \n
      I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
      \n
      Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693974973 {#4345
      date: 2023-09-06 06:36:13.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4342 …}
    +nested: Doctrine\ORM\PersistentCollection {#4339 …}
    +votes: Doctrine\ORM\PersistentCollection {#4337 …}
    +reports: Doctrine\ORM\PersistentCollection {#4351 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
    -id: 28109
    -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/213919"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693974973 {#4348
      date: 2023-09-06 06:36:13.0 +02:00
    }
  }
  "level" => 4
  "showNested" => true
  "view" => "tree"
]
Attributes
[
  "showNested" => true
]
Component
App\Twig\Components\EntryCommentsNestedComponent {#8039
  +comment: App\Entity\EntryComment {#4350
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4319
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4284
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4105
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: null
          +root: null
          +body: """
            I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
            \n
            You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
            \n
            And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1694071778 {#4106
            date: 2023-09-07 09:29:38.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4103 …}
          +nested: Doctrine\ORM\PersistentCollection {#4101 …}
          +votes: Doctrine\ORM\PersistentCollection {#4099 …}
          +reports: Doctrine\ORM\PersistentCollection {#4096 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
          -id: 27597
          -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2572674"
          +editedAt: DateTimeImmutable @1693564680 {#4111
            date: 2023-09-01 12:38:00.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693564547 {#4109
            date: 2023-09-01 12:35:47.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
          \n
          I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693906684 {#4282
          date: 2023-09-05 11:38:04.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4285 …}
        +nested: Doctrine\ORM\PersistentCollection {#4287 …}
        +votes: Doctrine\ORM\PersistentCollection {#4289 …}
        +reports: Doctrine\ORM\PersistentCollection {#4291 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
        -id: 28063
        -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/212522"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693906684 {#4283
          date: 2023-09-05 11:38:04.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
        \n
        Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
        \n
        Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
        \n
        Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
        \n
        If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
        \n
        I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693914344 {#4323
        date: 2023-09-05 13:45:44.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4316 …}
      +nested: Doctrine\ORM\PersistentCollection {#4314 …}
      +votes: Doctrine\ORM\PersistentCollection {#4318 …}
      +reports: Doctrine\ORM\PersistentCollection {#4329 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
      -id: 28065
      -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2687935"
      +editedAt: DateTimeImmutable @1693914611 {#4326
        date: 2023-09-05 13:50:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693914344 {#4322
        date: 2023-09-05 13:45:44.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
      \n
      I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
      \n
      I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
      \n
      Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693974973 {#4345
      date: 2023-09-06 06:36:13.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4342 …}
    +nested: Doctrine\ORM\PersistentCollection {#4339 …}
    +votes: Doctrine\ORM\PersistentCollection {#4337 …}
    +reports: Doctrine\ORM\PersistentCollection {#4351 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
    -id: 28109
    -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/213919"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693974973 {#4348
      date: 2023-09-06 06:36:13.0 +02:00
    }
  }
  +nestedComments: []
  +level: 4
  +view: "tree"
  -entryCommentRepository: App\Repository\EntryCommentRepository {#557 …}
  -twig: Twig\Environment {#1252 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
entry_comment App\Twig\Components\EntryCommentComponent 14.0 MiB 15.67 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4372
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4350
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4319
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4284
          +user: Proxies\__CG__\App\Entity\User {#1961 …2}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4105
            +user: App\Entity\User {#4088}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: null
            +root: null
            +body: """
              I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
              \n
              You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
              \n
              And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1694071778 {#4106
              date: 2023-09-07 09:29:38.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4103 …}
            +nested: Doctrine\ORM\PersistentCollection {#4101 …}
            +votes: Doctrine\ORM\PersistentCollection {#4099 …}
            +reports: Doctrine\ORM\PersistentCollection {#4096 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
            -id: 27597
            -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://discuss.tchncs.de/comment/2572674"
            +editedAt: DateTimeImmutable @1693564680 {#4111
              date: 2023-09-01 12:38:00.0 +02:00
            }
            +createdAt: DateTimeImmutable @1693564547 {#4109
              date: 2023-09-01 12:35:47.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
            \n
            I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693906684 {#4282
            date: 2023-09-05 11:38:04.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4285 …}
          +nested: Doctrine\ORM\PersistentCollection {#4287 …}
          +votes: Doctrine\ORM\PersistentCollection {#4289 …}
          +reports: Doctrine\ORM\PersistentCollection {#4291 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
          -id: 28063
          -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://voltage.vn/comment/212522"
          +editedAt: null
          +createdAt: DateTimeImmutable @1693906684 {#4283
            date: 2023-09-05 11:38:04.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
          \n
          Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
          \n
          Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
          \n
          Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
          \n
          If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
          \n
          I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693914344 {#4323
          date: 2023-09-05 13:45:44.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4316 …}
        +nested: Doctrine\ORM\PersistentCollection {#4314 …}
        +votes: Doctrine\ORM\PersistentCollection {#4318 …}
        +reports: Doctrine\ORM\PersistentCollection {#4329 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
        -id: 28065
        -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2687935"
        +editedAt: DateTimeImmutable @1693914611 {#4326
          date: 2023-09-05 13:50:11.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693914344 {#4322
          date: 2023-09-05 13:45:44.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
        \n
        I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
        \n
        I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
        \n
        Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693974973 {#4345
        date: 2023-09-06 06:36:13.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4342 …}
      +nested: Doctrine\ORM\PersistentCollection {#4339 …}
      +votes: Doctrine\ORM\PersistentCollection {#4337 …}
      +reports: Doctrine\ORM\PersistentCollection {#4351 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
      -id: 28109
      -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/213919"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693974973 {#4348
        date: 2023-09-06 06:36:13.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
      \n
      > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
      \n
      Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
      \n
      > API-like to abstract away the low-level components\n
      \n
      You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
      \n
      > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
      \n
      I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
      \n
      As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
      \n
      Definitely hope you’ll have fun being involved in that STEM program.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693999848 {#4367
      date: 2023-09-06 13:30:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4364 …}
    +nested: Doctrine\ORM\PersistentCollection {#4361 …}
    +votes: Doctrine\ORM\PersistentCollection {#4359 …}
    +reports: Doctrine\ORM\PersistentCollection {#4373 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
    -id: 28122
    -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2715856"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693999848 {#4370
      date: 2023-09-06 13:30:48.0 +02:00
    }
  }
  "showNested" => true
  "level" => 5
  "showEntryTitle" => false
  "showMagazineName" => false
]
Attributes
[]
Component
App\Twig\Components\EntryCommentComponent {#8094
  +comment: App\Entity\EntryComment {#4372
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4350
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4319
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4284
          +user: Proxies\__CG__\App\Entity\User {#1961 …2}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4105
            +user: App\Entity\User {#4088}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: null
            +root: null
            +body: """
              I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
              \n
              You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
              \n
              And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1694071778 {#4106
              date: 2023-09-07 09:29:38.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4103 …}
            +nested: Doctrine\ORM\PersistentCollection {#4101 …}
            +votes: Doctrine\ORM\PersistentCollection {#4099 …}
            +reports: Doctrine\ORM\PersistentCollection {#4096 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
            -id: 27597
            -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://discuss.tchncs.de/comment/2572674"
            +editedAt: DateTimeImmutable @1693564680 {#4111
              date: 2023-09-01 12:38:00.0 +02:00
            }
            +createdAt: DateTimeImmutable @1693564547 {#4109
              date: 2023-09-01 12:35:47.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
            \n
            I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693906684 {#4282
            date: 2023-09-05 11:38:04.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4285 …}
          +nested: Doctrine\ORM\PersistentCollection {#4287 …}
          +votes: Doctrine\ORM\PersistentCollection {#4289 …}
          +reports: Doctrine\ORM\PersistentCollection {#4291 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
          -id: 28063
          -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://voltage.vn/comment/212522"
          +editedAt: null
          +createdAt: DateTimeImmutable @1693906684 {#4283
            date: 2023-09-05 11:38:04.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
          \n
          Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
          \n
          Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
          \n
          Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
          \n
          If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
          \n
          I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693914344 {#4323
          date: 2023-09-05 13:45:44.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4316 …}
        +nested: Doctrine\ORM\PersistentCollection {#4314 …}
        +votes: Doctrine\ORM\PersistentCollection {#4318 …}
        +reports: Doctrine\ORM\PersistentCollection {#4329 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
        -id: 28065
        -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2687935"
        +editedAt: DateTimeImmutable @1693914611 {#4326
          date: 2023-09-05 13:50:11.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693914344 {#4322
          date: 2023-09-05 13:45:44.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
        \n
        I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
        \n
        I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
        \n
        Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693974973 {#4345
        date: 2023-09-06 06:36:13.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4342 …}
      +nested: Doctrine\ORM\PersistentCollection {#4339 …}
      +votes: Doctrine\ORM\PersistentCollection {#4337 …}
      +reports: Doctrine\ORM\PersistentCollection {#4351 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
      -id: 28109
      -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/213919"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693974973 {#4348
        date: 2023-09-06 06:36:13.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
      \n
      > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
      \n
      Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
      \n
      > API-like to abstract away the low-level components\n
      \n
      You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
      \n
      > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
      \n
      I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
      \n
      As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
      \n
      Definitely hope you’ll have fun being involved in that STEM program.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693999848 {#4367
      date: 2023-09-06 13:30:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4364 …}
    +nested: Doctrine\ORM\PersistentCollection {#4361 …}
    +votes: Doctrine\ORM\PersistentCollection {#4359 …}
    +reports: Doctrine\ORM\PersistentCollection {#4373 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
    -id: 28122
    -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2715856"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693999848 {#4370
      date: 2023-09-06 13:30:48.0 +02:00
    }
  }
  +showMagazineName: false
  +showEntryTitle: false
  +showNested: true
  +level: 5
  +canSeeTrash: false
  +dateAsUrl: false
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -authorizationChecker: Symfony\Component\Security\Core\Authorization\AuthorizationChecker {#931 …}
}
user_inline App\Twig\Components\UserInlineComponent 14.0 MiB 0.13 ms
Input props
[
  "user" => App\Entity\User {#4088
    +avatar: null
    +cover: null
    +email: "rufus@discuss.tchncs.de"
    +username: "@rufus@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1729234169 {#4110
      date: 2024-10-18 08:49:29.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
    +entries: Doctrine\ORM\PersistentCollection {#4081 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
    +posts: Doctrine\ORM\PersistentCollection {#4141 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
    +follows: Doctrine\ORM\PersistentCollection {#4153 …}
    +followers: Doctrine\ORM\PersistentCollection {#4155 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
    +reports: Doctrine\ORM\PersistentCollection {#4165 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
    +violations: Doctrine\ORM\PersistentCollection {#4169 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
    +awards: Doctrine\ORM\PersistentCollection {#4173 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
    +categories: Doctrine\ORM\PersistentCollection {#4177 …}
    -id: 22773
    -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
    +apId: "rufus@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/rufus"
    +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "rufus"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728254912 {#4107
      date: 2024-10-07 00:48:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689082128 {#4100
      date: 2023-07-11 15:28:48.0 +02:00
    }
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#8139
  +user: App\Entity\User {#4088
    +avatar: null
    +cover: null
    +email: "rufus@discuss.tchncs.de"
    +username: "@rufus@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1729234169 {#4110
      date: 2024-10-18 08:49:29.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
    +entries: Doctrine\ORM\PersistentCollection {#4081 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
    +posts: Doctrine\ORM\PersistentCollection {#4141 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
    +follows: Doctrine\ORM\PersistentCollection {#4153 …}
    +followers: Doctrine\ORM\PersistentCollection {#4155 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
    +reports: Doctrine\ORM\PersistentCollection {#4165 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
    +violations: Doctrine\ORM\PersistentCollection {#4169 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
    +awards: Doctrine\ORM\PersistentCollection {#4173 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
    +categories: Doctrine\ORM\PersistentCollection {#4177 …}
    -id: 22773
    -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
    +apId: "rufus@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/rufus"
    +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "rufus"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728254912 {#4107
      date: 2024-10-07 00:48:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689082128 {#4100
      date: 2023-07-11 15:28:48.0 +02:00
    }
  }
  +showAvatar: false
}
date App\Twig\Components\DateComponent 14.0 MiB 0.13 ms
Input props
[
  "date" => DateTimeImmutable @1693999848 {#4370
    date: 2023-09-06 13:30:48.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#8194
  +date: DateTimeImmutable @1693999848 {#4370
    date: 2023-09-06 13:30:48.0 +02:00
  }
}
date_edited App\Twig\Components\DateEditedComponent 14.0 MiB 0.09 ms
Input props
[
  "createdAt" => DateTimeImmutable @1693999848 {#4370
    date: 2023-09-06 13:30:48.0 +02:00
  }
  "editedAt" => null
]
Attributes
[]
Component
App\Twig\Components\DateEditedComponent {#8248
  +createdAt: DateTimeImmutable @1693999848 {#4370
    date: 2023-09-06 13:30:48.0 +02:00
  }
  +editedAt: null
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 0.13 ms
Input props
[
  "user" => App\Entity\User {#4088
    +avatar: null
    +cover: null
    +email: "rufus@discuss.tchncs.de"
    +username: "@rufus@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1729234169 {#4110
      date: 2024-10-18 08:49:29.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
    +entries: Doctrine\ORM\PersistentCollection {#4081 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
    +posts: Doctrine\ORM\PersistentCollection {#4141 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
    +follows: Doctrine\ORM\PersistentCollection {#4153 …}
    +followers: Doctrine\ORM\PersistentCollection {#4155 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
    +reports: Doctrine\ORM\PersistentCollection {#4165 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
    +violations: Doctrine\ORM\PersistentCollection {#4169 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
    +awards: Doctrine\ORM\PersistentCollection {#4173 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
    +categories: Doctrine\ORM\PersistentCollection {#4177 …}
    -id: 22773
    -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
    +apId: "rufus@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/rufus"
    +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "rufus"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728254912 {#4107
      date: 2024-10-07 00:48:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689082128 {#4100
      date: 2023-07-11 15:28:48.0 +02:00
    }
  }
  "width" => 40
  "height" => 40
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#8302
  +width: 40
  +height: 40
  +user: App\Entity\User {#4088
    +avatar: null
    +cover: null
    +email: "rufus@discuss.tchncs.de"
    +username: "@rufus@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1729234169 {#4110
      date: 2024-10-18 08:49:29.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
    +entries: Doctrine\ORM\PersistentCollection {#4081 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
    +posts: Doctrine\ORM\PersistentCollection {#4141 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
    +follows: Doctrine\ORM\PersistentCollection {#4153 …}
    +followers: Doctrine\ORM\PersistentCollection {#4155 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
    +reports: Doctrine\ORM\PersistentCollection {#4165 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
    +violations: Doctrine\ORM\PersistentCollection {#4169 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
    +awards: Doctrine\ORM\PersistentCollection {#4173 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
    +categories: Doctrine\ORM\PersistentCollection {#4177 …}
    -id: 22773
    -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
    +apId: "rufus@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/rufus"
    +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "rufus"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728254912 {#4107
      date: 2024-10-07 00:48:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689082128 {#4100
      date: 2023-07-11 15:28:48.0 +02:00
    }
  }
  +asLink: true
}
vote App\Twig\Components\VoteComponent 14.0 MiB 0.64 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4372
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4350
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4319
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4284
          +user: Proxies\__CG__\App\Entity\User {#1961 …2}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4105
            +user: App\Entity\User {#4088}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: null
            +root: null
            +body: """
              I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
              \n
              You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
              \n
              And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1694071778 {#4106
              date: 2023-09-07 09:29:38.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4103 …}
            +nested: Doctrine\ORM\PersistentCollection {#4101 …}
            +votes: Doctrine\ORM\PersistentCollection {#4099 …}
            +reports: Doctrine\ORM\PersistentCollection {#4096 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
            -id: 27597
            -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://discuss.tchncs.de/comment/2572674"
            +editedAt: DateTimeImmutable @1693564680 {#4111
              date: 2023-09-01 12:38:00.0 +02:00
            }
            +createdAt: DateTimeImmutable @1693564547 {#4109
              date: 2023-09-01 12:35:47.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
            \n
            I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693906684 {#4282
            date: 2023-09-05 11:38:04.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4285 …}
          +nested: Doctrine\ORM\PersistentCollection {#4287 …}
          +votes: Doctrine\ORM\PersistentCollection {#4289 …}
          +reports: Doctrine\ORM\PersistentCollection {#4291 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
          -id: 28063
          -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://voltage.vn/comment/212522"
          +editedAt: null
          +createdAt: DateTimeImmutable @1693906684 {#4283
            date: 2023-09-05 11:38:04.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
          \n
          Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
          \n
          Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
          \n
          Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
          \n
          If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
          \n
          I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693914344 {#4323
          date: 2023-09-05 13:45:44.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4316 …}
        +nested: Doctrine\ORM\PersistentCollection {#4314 …}
        +votes: Doctrine\ORM\PersistentCollection {#4318 …}
        +reports: Doctrine\ORM\PersistentCollection {#4329 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
        -id: 28065
        -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2687935"
        +editedAt: DateTimeImmutable @1693914611 {#4326
          date: 2023-09-05 13:50:11.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693914344 {#4322
          date: 2023-09-05 13:45:44.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
        \n
        I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
        \n
        I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
        \n
        Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693974973 {#4345
        date: 2023-09-06 06:36:13.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4342 …}
      +nested: Doctrine\ORM\PersistentCollection {#4339 …}
      +votes: Doctrine\ORM\PersistentCollection {#4337 …}
      +reports: Doctrine\ORM\PersistentCollection {#4351 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
      -id: 28109
      -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/213919"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693974973 {#4348
        date: 2023-09-06 06:36:13.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
      \n
      > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
      \n
      Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
      \n
      > API-like to abstract away the low-level components\n
      \n
      You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
      \n
      > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
      \n
      I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
      \n
      As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
      \n
      Definitely hope you’ll have fun being involved in that STEM program.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693999848 {#4367
      date: 2023-09-06 13:30:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4364 …}
    +nested: Doctrine\ORM\PersistentCollection {#4361 …}
    +votes: Doctrine\ORM\PersistentCollection {#4359 …}
    +reports: Doctrine\ORM\PersistentCollection {#4373 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
    -id: 28122
    -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2715856"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693999848 {#4370
      date: 2023-09-06 13:30:48.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\VoteComponent {#8415
  +subject: App\Entity\EntryComment {#4372
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4350
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4319
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4284
          +user: Proxies\__CG__\App\Entity\User {#1961 …2}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4105
            +user: App\Entity\User {#4088}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: null
            +root: null
            +body: """
              I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
              \n
              You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
              \n
              And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1694071778 {#4106
              date: 2023-09-07 09:29:38.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4103 …}
            +nested: Doctrine\ORM\PersistentCollection {#4101 …}
            +votes: Doctrine\ORM\PersistentCollection {#4099 …}
            +reports: Doctrine\ORM\PersistentCollection {#4096 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
            -id: 27597
            -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://discuss.tchncs.de/comment/2572674"
            +editedAt: DateTimeImmutable @1693564680 {#4111
              date: 2023-09-01 12:38:00.0 +02:00
            }
            +createdAt: DateTimeImmutable @1693564547 {#4109
              date: 2023-09-01 12:35:47.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
            \n
            I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693906684 {#4282
            date: 2023-09-05 11:38:04.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4285 …}
          +nested: Doctrine\ORM\PersistentCollection {#4287 …}
          +votes: Doctrine\ORM\PersistentCollection {#4289 …}
          +reports: Doctrine\ORM\PersistentCollection {#4291 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
          -id: 28063
          -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://voltage.vn/comment/212522"
          +editedAt: null
          +createdAt: DateTimeImmutable @1693906684 {#4283
            date: 2023-09-05 11:38:04.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
          \n
          Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
          \n
          Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
          \n
          Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
          \n
          If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
          \n
          I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693914344 {#4323
          date: 2023-09-05 13:45:44.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4316 …}
        +nested: Doctrine\ORM\PersistentCollection {#4314 …}
        +votes: Doctrine\ORM\PersistentCollection {#4318 …}
        +reports: Doctrine\ORM\PersistentCollection {#4329 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
        -id: 28065
        -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2687935"
        +editedAt: DateTimeImmutable @1693914611 {#4326
          date: 2023-09-05 13:50:11.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693914344 {#4322
          date: 2023-09-05 13:45:44.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
        \n
        I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
        \n
        I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
        \n
        Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693974973 {#4345
        date: 2023-09-06 06:36:13.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4342 …}
      +nested: Doctrine\ORM\PersistentCollection {#4339 …}
      +votes: Doctrine\ORM\PersistentCollection {#4337 …}
      +reports: Doctrine\ORM\PersistentCollection {#4351 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
      -id: 28109
      -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/213919"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693974973 {#4348
        date: 2023-09-06 06:36:13.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
      \n
      > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
      \n
      Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
      \n
      > API-like to abstract away the low-level components\n
      \n
      You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
      \n
      > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
      \n
      I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
      \n
      As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
      \n
      Definitely hope you’ll have fun being involved in that STEM program.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693999848 {#4367
      date: 2023-09-06 13:30:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4364 …}
    +nested: Doctrine\ORM\PersistentCollection {#4361 …}
    +votes: Doctrine\ORM\PersistentCollection {#4359 …}
    +reports: Doctrine\ORM\PersistentCollection {#4373 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
    -id: 28122
    -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2715856"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693999848 {#4370
      date: 2023-09-06 13:30:48.0 +02:00
    }
  }
  +formDest: "entry_comment"
  +showDownvote: true
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
boost App\Twig\Components\BoostComponent 14.0 MiB 2.92 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4372
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4350
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4319
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4284
          +user: Proxies\__CG__\App\Entity\User {#1961 …2}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4105
            +user: App\Entity\User {#4088}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: null
            +root: null
            +body: """
              I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
              \n
              You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
              \n
              And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1694071778 {#4106
              date: 2023-09-07 09:29:38.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4103 …}
            +nested: Doctrine\ORM\PersistentCollection {#4101 …}
            +votes: Doctrine\ORM\PersistentCollection {#4099 …}
            +reports: Doctrine\ORM\PersistentCollection {#4096 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
            -id: 27597
            -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://discuss.tchncs.de/comment/2572674"
            +editedAt: DateTimeImmutable @1693564680 {#4111
              date: 2023-09-01 12:38:00.0 +02:00
            }
            +createdAt: DateTimeImmutable @1693564547 {#4109
              date: 2023-09-01 12:35:47.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
            \n
            I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693906684 {#4282
            date: 2023-09-05 11:38:04.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4285 …}
          +nested: Doctrine\ORM\PersistentCollection {#4287 …}
          +votes: Doctrine\ORM\PersistentCollection {#4289 …}
          +reports: Doctrine\ORM\PersistentCollection {#4291 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
          -id: 28063
          -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://voltage.vn/comment/212522"
          +editedAt: null
          +createdAt: DateTimeImmutable @1693906684 {#4283
            date: 2023-09-05 11:38:04.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
          \n
          Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
          \n
          Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
          \n
          Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
          \n
          If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
          \n
          I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693914344 {#4323
          date: 2023-09-05 13:45:44.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4316 …}
        +nested: Doctrine\ORM\PersistentCollection {#4314 …}
        +votes: Doctrine\ORM\PersistentCollection {#4318 …}
        +reports: Doctrine\ORM\PersistentCollection {#4329 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
        -id: 28065
        -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2687935"
        +editedAt: DateTimeImmutable @1693914611 {#4326
          date: 2023-09-05 13:50:11.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693914344 {#4322
          date: 2023-09-05 13:45:44.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
        \n
        I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
        \n
        I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
        \n
        Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693974973 {#4345
        date: 2023-09-06 06:36:13.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4342 …}
      +nested: Doctrine\ORM\PersistentCollection {#4339 …}
      +votes: Doctrine\ORM\PersistentCollection {#4337 …}
      +reports: Doctrine\ORM\PersistentCollection {#4351 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
      -id: 28109
      -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/213919"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693974973 {#4348
        date: 2023-09-06 06:36:13.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
      \n
      > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
      \n
      Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
      \n
      > API-like to abstract away the low-level components\n
      \n
      You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
      \n
      > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
      \n
      I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
      \n
      As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
      \n
      Definitely hope you’ll have fun being involved in that STEM program.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693999848 {#4367
      date: 2023-09-06 13:30:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4364 …}
    +nested: Doctrine\ORM\PersistentCollection {#4361 …}
    +votes: Doctrine\ORM\PersistentCollection {#4359 …}
    +reports: Doctrine\ORM\PersistentCollection {#4373 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
    -id: 28122
    -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2715856"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693999848 {#4370
      date: 2023-09-06 13:30:48.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\BoostComponent {#8472
  +formDest: "entry_comment"
  +subject: App\Entity\EntryComment {#4372
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4350
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4319
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4284
          +user: Proxies\__CG__\App\Entity\User {#1961 …2}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4105
            +user: App\Entity\User {#4088}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: null
            +root: null
            +body: """
              I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
              \n
              You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
              \n
              And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1694071778 {#4106
              date: 2023-09-07 09:29:38.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4103 …}
            +nested: Doctrine\ORM\PersistentCollection {#4101 …}
            +votes: Doctrine\ORM\PersistentCollection {#4099 …}
            +reports: Doctrine\ORM\PersistentCollection {#4096 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
            -id: 27597
            -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://discuss.tchncs.de/comment/2572674"
            +editedAt: DateTimeImmutable @1693564680 {#4111
              date: 2023-09-01 12:38:00.0 +02:00
            }
            +createdAt: DateTimeImmutable @1693564547 {#4109
              date: 2023-09-01 12:35:47.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
            \n
            I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693906684 {#4282
            date: 2023-09-05 11:38:04.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4285 …}
          +nested: Doctrine\ORM\PersistentCollection {#4287 …}
          +votes: Doctrine\ORM\PersistentCollection {#4289 …}
          +reports: Doctrine\ORM\PersistentCollection {#4291 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
          -id: 28063
          -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://voltage.vn/comment/212522"
          +editedAt: null
          +createdAt: DateTimeImmutable @1693906684 {#4283
            date: 2023-09-05 11:38:04.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
          \n
          Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
          \n
          Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
          \n
          Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
          \n
          If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
          \n
          I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693914344 {#4323
          date: 2023-09-05 13:45:44.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4316 …}
        +nested: Doctrine\ORM\PersistentCollection {#4314 …}
        +votes: Doctrine\ORM\PersistentCollection {#4318 …}
        +reports: Doctrine\ORM\PersistentCollection {#4329 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
        -id: 28065
        -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2687935"
        +editedAt: DateTimeImmutable @1693914611 {#4326
          date: 2023-09-05 13:50:11.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693914344 {#4322
          date: 2023-09-05 13:45:44.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
        \n
        I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
        \n
        I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
        \n
        Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693974973 {#4345
        date: 2023-09-06 06:36:13.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4342 …}
      +nested: Doctrine\ORM\PersistentCollection {#4339 …}
      +votes: Doctrine\ORM\PersistentCollection {#4337 …}
      +reports: Doctrine\ORM\PersistentCollection {#4351 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
      -id: 28109
      -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/213919"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693974973 {#4348
        date: 2023-09-06 06:36:13.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
      \n
      > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
      \n
      Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
      \n
      > API-like to abstract away the low-level components\n
      \n
      You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
      \n
      > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
      \n
      I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
      \n
      As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
      \n
      Definitely hope you’ll have fun being involved in that STEM program.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693999848 {#4367
      date: 2023-09-06 13:30:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4364 …}
    +nested: Doctrine\ORM\PersistentCollection {#4361 …}
    +votes: Doctrine\ORM\PersistentCollection {#4359 …}
    +reports: Doctrine\ORM\PersistentCollection {#4373 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
    -id: 28122
    -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2715856"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693999848 {#4370
      date: 2023-09-06 13:30:48.0 +02:00
    }
  }
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
entry_comments_nested App\Twig\Components\EntryCommentsNestedComponent 14.0 MiB 7.27 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4372
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4350
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4319
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4284
          +user: Proxies\__CG__\App\Entity\User {#1961 …2}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4105
            +user: App\Entity\User {#4088}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: null
            +root: null
            +body: """
              I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
              \n
              You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
              \n
              And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1694071778 {#4106
              date: 2023-09-07 09:29:38.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4103 …}
            +nested: Doctrine\ORM\PersistentCollection {#4101 …}
            +votes: Doctrine\ORM\PersistentCollection {#4099 …}
            +reports: Doctrine\ORM\PersistentCollection {#4096 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
            -id: 27597
            -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://discuss.tchncs.de/comment/2572674"
            +editedAt: DateTimeImmutable @1693564680 {#4111
              date: 2023-09-01 12:38:00.0 +02:00
            }
            +createdAt: DateTimeImmutable @1693564547 {#4109
              date: 2023-09-01 12:35:47.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
            \n
            I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693906684 {#4282
            date: 2023-09-05 11:38:04.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4285 …}
          +nested: Doctrine\ORM\PersistentCollection {#4287 …}
          +votes: Doctrine\ORM\PersistentCollection {#4289 …}
          +reports: Doctrine\ORM\PersistentCollection {#4291 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
          -id: 28063
          -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://voltage.vn/comment/212522"
          +editedAt: null
          +createdAt: DateTimeImmutable @1693906684 {#4283
            date: 2023-09-05 11:38:04.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
          \n
          Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
          \n
          Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
          \n
          Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
          \n
          If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
          \n
          I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693914344 {#4323
          date: 2023-09-05 13:45:44.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4316 …}
        +nested: Doctrine\ORM\PersistentCollection {#4314 …}
        +votes: Doctrine\ORM\PersistentCollection {#4318 …}
        +reports: Doctrine\ORM\PersistentCollection {#4329 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
        -id: 28065
        -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2687935"
        +editedAt: DateTimeImmutable @1693914611 {#4326
          date: 2023-09-05 13:50:11.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693914344 {#4322
          date: 2023-09-05 13:45:44.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
        \n
        I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
        \n
        I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
        \n
        Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693974973 {#4345
        date: 2023-09-06 06:36:13.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4342 …}
      +nested: Doctrine\ORM\PersistentCollection {#4339 …}
      +votes: Doctrine\ORM\PersistentCollection {#4337 …}
      +reports: Doctrine\ORM\PersistentCollection {#4351 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
      -id: 28109
      -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/213919"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693974973 {#4348
        date: 2023-09-06 06:36:13.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
      \n
      > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
      \n
      Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
      \n
      > API-like to abstract away the low-level components\n
      \n
      You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
      \n
      > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
      \n
      I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
      \n
      As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
      \n
      Definitely hope you’ll have fun being involved in that STEM program.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693999848 {#4367
      date: 2023-09-06 13:30:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4364 …}
    +nested: Doctrine\ORM\PersistentCollection {#4361 …}
    +votes: Doctrine\ORM\PersistentCollection {#4359 …}
    +reports: Doctrine\ORM\PersistentCollection {#4373 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
    -id: 28122
    -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2715856"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693999848 {#4370
      date: 2023-09-06 13:30:48.0 +02:00
    }
  }
  "level" => 5
  "showNested" => true
  "view" => "tree"
]
Attributes
[
  "showNested" => true
]
Component
App\Twig\Components\EntryCommentsNestedComponent {#8712
  +comment: App\Entity\EntryComment {#4372
    +user: App\Entity\User {#4088
      +avatar: null
      +cover: null
      +email: "rufus@discuss.tchncs.de"
      +username: "@rufus@discuss.tchncs.de"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1729234169 {#4110
        date: 2024-10-18 08:49:29.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
      +entries: Doctrine\ORM\PersistentCollection {#4081 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
      +posts: Doctrine\ORM\PersistentCollection {#4141 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
      +follows: Doctrine\ORM\PersistentCollection {#4153 …}
      +followers: Doctrine\ORM\PersistentCollection {#4155 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
      +reports: Doctrine\ORM\PersistentCollection {#4165 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
      +violations: Doctrine\ORM\PersistentCollection {#4169 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
      +awards: Doctrine\ORM\PersistentCollection {#4173 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
      +categories: Doctrine\ORM\PersistentCollection {#4177 …}
      -id: 22773
      -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
      +apId: "rufus@discuss.tchncs.de"
      +apProfileId: "https://discuss.tchncs.de/u/rufus"
      +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
      +apFollowersUrl: null
      +apInboxUrl: "https://discuss.tchncs.de/inbox"
      +apDomain: "discuss.tchncs.de"
      +apPreferredUsername: "rufus"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1728254912 {#4107
        date: 2024-10-07 00:48:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689082128 {#4100
        date: 2023-07-11 15:28:48.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4350
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4319
        +user: App\Entity\User {#4088}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4284
          +user: Proxies\__CG__\App\Entity\User {#1961 …2}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4105
            +user: App\Entity\User {#4088}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: null
            +root: null
            +body: """
              I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
              \n
              You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
              \n
              And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1694071778 {#4106
              date: 2023-09-07 09:29:38.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4103 …}
            +nested: Doctrine\ORM\PersistentCollection {#4101 …}
            +votes: Doctrine\ORM\PersistentCollection {#4099 …}
            +reports: Doctrine\ORM\PersistentCollection {#4096 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
            -id: 27597
            -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://discuss.tchncs.de/comment/2572674"
            +editedAt: DateTimeImmutable @1693564680 {#4111
              date: 2023-09-01 12:38:00.0 +02:00
            }
            +createdAt: DateTimeImmutable @1693564547 {#4109
              date: 2023-09-01 12:35:47.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
            \n
            I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693906684 {#4282
            date: 2023-09-05 11:38:04.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4285 …}
          +nested: Doctrine\ORM\PersistentCollection {#4287 …}
          +votes: Doctrine\ORM\PersistentCollection {#4289 …}
          +reports: Doctrine\ORM\PersistentCollection {#4291 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
          -id: 28063
          -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://voltage.vn/comment/212522"
          +editedAt: null
          +createdAt: DateTimeImmutable @1693906684 {#4283
            date: 2023-09-05 11:38:04.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
          \n
          Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
          \n
          Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
          \n
          Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
          \n
          If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
          \n
          I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693914344 {#4323
          date: 2023-09-05 13:45:44.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4316 …}
        +nested: Doctrine\ORM\PersistentCollection {#4314 …}
        +votes: Doctrine\ORM\PersistentCollection {#4318 …}
        +reports: Doctrine\ORM\PersistentCollection {#4329 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
        -id: 28065
        -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://discuss.tchncs.de/comment/2687935"
        +editedAt: DateTimeImmutable @1693914611 {#4326
          date: 2023-09-05 13:50:11.0 +02:00
        }
        +createdAt: DateTimeImmutable @1693914344 {#4322
          date: 2023-09-05 13:45:44.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
        \n
        I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
        \n
        I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
        \n
        Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693974973 {#4345
        date: 2023-09-06 06:36:13.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4342 …}
      +nested: Doctrine\ORM\PersistentCollection {#4339 …}
      +votes: Doctrine\ORM\PersistentCollection {#4337 …}
      +reports: Doctrine\ORM\PersistentCollection {#4351 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
      -id: 28109
      -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/213919"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693974973 {#4348
        date: 2023-09-06 06:36:13.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
      \n
      > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
      \n
      Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
      \n
      > API-like to abstract away the low-level components\n
      \n
      You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
      \n
      > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
      \n
      I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
      \n
      As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
      \n
      Definitely hope you’ll have fun being involved in that STEM program.
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693999848 {#4367
      date: 2023-09-06 13:30:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4364 …}
    +nested: Doctrine\ORM\PersistentCollection {#4361 …}
    +votes: Doctrine\ORM\PersistentCollection {#4359 …}
    +reports: Doctrine\ORM\PersistentCollection {#4373 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
    -id: 28122
    -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://discuss.tchncs.de/comment/2715856"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693999848 {#4370
      date: 2023-09-06 13:30:48.0 +02:00
    }
  }
  +nestedComments: []
  +level: 5
  +view: "tree"
  -entryCommentRepository: App\Repository\EntryCommentRepository {#557 …}
  -twig: Twig\Environment {#1252 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
entry_comment App\Twig\Components\EntryCommentComponent 14.0 MiB 6.58 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4394
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4372
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4350
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4319
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4284
            +user: Proxies\__CG__\App\Entity\User {#1961 …2}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: App\Entity\EntryComment {#4105
              +user: App\Entity\User {#4088}
              +entry: App\Entity\Entry {#2400}
              +magazine: App\Entity\Magazine {#262}
              +image: null
              +parent: null
              +root: null
              +body: """
                I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
                \n
                You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
                \n
                And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
                """
              +lang: "en"
              +isAdult: false
              +favouriteCount: 0
              +score: 0
              +lastActive: DateTime @1694071778 {#4106
                date: 2023-09-07 09:29:38.0 +02:00
              }
              +ip: null
              +tags: null
              +mentions: [
                "@Saigonauticon@voltage.vn"
              ]
              +children: Doctrine\ORM\PersistentCollection {#4103 …}
              +nested: Doctrine\ORM\PersistentCollection {#4101 …}
              +votes: Doctrine\ORM\PersistentCollection {#4099 …}
              +reports: Doctrine\ORM\PersistentCollection {#4096 …}
              +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
              +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
              -id: 27597
              -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
              +ranking: 0
              +commentCount: 0
              +upVotes: 0
              +downVotes: 0
              +visibility: "visible             "
              +apId: "https://discuss.tchncs.de/comment/2572674"
              +editedAt: DateTimeImmutable @1693564680 {#4111
                date: 2023-09-01 12:38:00.0 +02:00
              }
              +createdAt: DateTimeImmutable @1693564547 {#4109
                date: 2023-09-01 12:35:47.0 +02:00
              }
            }
            +root: App\Entity\EntryComment {#4105}
            +body: """
              They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
              \n
              I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1693906684 {#4282
              date: 2023-09-05 11:38:04.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
              "@rufus@discuss.tchncs.de"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4285 …}
            +nested: Doctrine\ORM\PersistentCollection {#4287 …}
            +votes: Doctrine\ORM\PersistentCollection {#4289 …}
            +reports: Doctrine\ORM\PersistentCollection {#4291 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
            -id: 28063
            -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://voltage.vn/comment/212522"
            +editedAt: null
            +createdAt: DateTimeImmutable @1693906684 {#4283
              date: 2023-09-05 11:38:04.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
            \n
            Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
            \n
            Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
            \n
            Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
            \n
            If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
            \n
            I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693914344 {#4323
            date: 2023-09-05 13:45:44.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4316 …}
          +nested: Doctrine\ORM\PersistentCollection {#4314 …}
          +votes: Doctrine\ORM\PersistentCollection {#4318 …}
          +reports: Doctrine\ORM\PersistentCollection {#4329 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
          -id: 28065
          -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2687935"
          +editedAt: DateTimeImmutable @1693914611 {#4326
            date: 2023-09-05 13:50:11.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693914344 {#4322
            date: 2023-09-05 13:45:44.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
          \n
          I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
          \n
          I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
          \n
          Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693974973 {#4345
          date: 2023-09-06 06:36:13.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4342 …}
        +nested: Doctrine\ORM\PersistentCollection {#4339 …}
        +votes: Doctrine\ORM\PersistentCollection {#4337 …}
        +reports: Doctrine\ORM\PersistentCollection {#4351 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
        -id: 28109
        -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/213919"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693974973 {#4348
          date: 2023-09-06 06:36:13.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
        \n
        > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
        \n
        Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
        \n
        > API-like to abstract away the low-level components\n
        \n
        You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
        \n
        > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
        \n
        I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
        \n
        As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
        \n
        Definitely hope you’ll have fun being involved in that STEM program.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693999848 {#4367
        date: 2023-09-06 13:30:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4364 …}
      +nested: Doctrine\ORM\PersistentCollection {#4361 …}
      +votes: Doctrine\ORM\PersistentCollection {#4359 …}
      +reports: Doctrine\ORM\PersistentCollection {#4373 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
      -id: 28122
      -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2715856"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693999848 {#4370
        date: 2023-09-06 13:30:48.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Good advice all around! Thanks!\n
      \n
      I’ve also messed around with the ESP8266 and various models of ESP32. Their WiFi time-of-flight stuff is *interesting*. I’ve quite a few projects with both actually! My main complaint is that the GPIO don’t behave nicely (also the esp8266 is a power hog and reboots if you screw up the network stack). They are much slower than I’d expect, and have weird states on boot. It’s not too bad to work around this stuff, but I chose the Pi Pico W so as not to have to explain it.\n
      \n
      It still blows me away that I can easily do public-private key encryption on the ESP32. And graphics. At the same time!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 1
    +score: 0
    +lastActive: DateTime @1694071771 {#4389
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4386 …}
    +nested: Doctrine\ORM\PersistentCollection {#4383 …}
    +votes: Doctrine\ORM\PersistentCollection {#4381 …}
    +reports: Doctrine\ORM\PersistentCollection {#4395 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4397 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4399 …}
    -id: 28234
    -bodyTs: "'actual':36 'advic':2 'also':8,48 'around':4,10,85 'away':107 'bad':82 'behav':46 'blow':105 'boot':77 'chose':90 'complaint':39 'd':70 'easili':111 'encrypt':117 'esp32':18,120 'esp8266':13,50 'expect':71 'explain':101 'flight':24 'good':1 'gpio':43 'graphic':122 'hog':54 'interest':27 'key':116 'main':38 'mess':9 'model':16 'much':66 'network':62 'nice':47 'pi':92 'pico':93 'power':53 'privat':115 'project':33 'public':114 'public-priv':113 'quit':30 'reboot':56 'screw':59 'slower':67 'stack':63 'state':75 'still':104 'stuff':25,87 'thank':5 'time':22,126 'time-of-flight':21 'various':15 've':7,29 'w':94 'weird':74 'wifi':20 'work':84"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/216358"
    +editedAt: null
    +createdAt: DateTimeImmutable @1694071771 {#4392
      date: 2023-09-07 09:29:31.0 +02:00
    }
  }
  "showNested" => true
  "level" => 6
  "showEntryTitle" => false
  "showMagazineName" => false
]
Attributes
[]
Component
App\Twig\Components\EntryCommentComponent {#8767
  +comment: App\Entity\EntryComment {#4394
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4372
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4350
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4319
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4284
            +user: Proxies\__CG__\App\Entity\User {#1961 …2}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: App\Entity\EntryComment {#4105
              +user: App\Entity\User {#4088}
              +entry: App\Entity\Entry {#2400}
              +magazine: App\Entity\Magazine {#262}
              +image: null
              +parent: null
              +root: null
              +body: """
                I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
                \n
                You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
                \n
                And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
                """
              +lang: "en"
              +isAdult: false
              +favouriteCount: 0
              +score: 0
              +lastActive: DateTime @1694071778 {#4106
                date: 2023-09-07 09:29:38.0 +02:00
              }
              +ip: null
              +tags: null
              +mentions: [
                "@Saigonauticon@voltage.vn"
              ]
              +children: Doctrine\ORM\PersistentCollection {#4103 …}
              +nested: Doctrine\ORM\PersistentCollection {#4101 …}
              +votes: Doctrine\ORM\PersistentCollection {#4099 …}
              +reports: Doctrine\ORM\PersistentCollection {#4096 …}
              +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
              +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
              -id: 27597
              -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
              +ranking: 0
              +commentCount: 0
              +upVotes: 0
              +downVotes: 0
              +visibility: "visible             "
              +apId: "https://discuss.tchncs.de/comment/2572674"
              +editedAt: DateTimeImmutable @1693564680 {#4111
                date: 2023-09-01 12:38:00.0 +02:00
              }
              +createdAt: DateTimeImmutable @1693564547 {#4109
                date: 2023-09-01 12:35:47.0 +02:00
              }
            }
            +root: App\Entity\EntryComment {#4105}
            +body: """
              They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
              \n
              I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1693906684 {#4282
              date: 2023-09-05 11:38:04.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
              "@rufus@discuss.tchncs.de"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4285 …}
            +nested: Doctrine\ORM\PersistentCollection {#4287 …}
            +votes: Doctrine\ORM\PersistentCollection {#4289 …}
            +reports: Doctrine\ORM\PersistentCollection {#4291 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
            -id: 28063
            -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://voltage.vn/comment/212522"
            +editedAt: null
            +createdAt: DateTimeImmutable @1693906684 {#4283
              date: 2023-09-05 11:38:04.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
            \n
            Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
            \n
            Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
            \n
            Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
            \n
            If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
            \n
            I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693914344 {#4323
            date: 2023-09-05 13:45:44.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4316 …}
          +nested: Doctrine\ORM\PersistentCollection {#4314 …}
          +votes: Doctrine\ORM\PersistentCollection {#4318 …}
          +reports: Doctrine\ORM\PersistentCollection {#4329 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
          -id: 28065
          -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2687935"
          +editedAt: DateTimeImmutable @1693914611 {#4326
            date: 2023-09-05 13:50:11.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693914344 {#4322
            date: 2023-09-05 13:45:44.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
          \n
          I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
          \n
          I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
          \n
          Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693974973 {#4345
          date: 2023-09-06 06:36:13.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4342 …}
        +nested: Doctrine\ORM\PersistentCollection {#4339 …}
        +votes: Doctrine\ORM\PersistentCollection {#4337 …}
        +reports: Doctrine\ORM\PersistentCollection {#4351 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
        -id: 28109
        -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/213919"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693974973 {#4348
          date: 2023-09-06 06:36:13.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
        \n
        > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
        \n
        Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
        \n
        > API-like to abstract away the low-level components\n
        \n
        You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
        \n
        > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
        \n
        I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
        \n
        As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
        \n
        Definitely hope you’ll have fun being involved in that STEM program.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693999848 {#4367
        date: 2023-09-06 13:30:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4364 …}
      +nested: Doctrine\ORM\PersistentCollection {#4361 …}
      +votes: Doctrine\ORM\PersistentCollection {#4359 …}
      +reports: Doctrine\ORM\PersistentCollection {#4373 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
      -id: 28122
      -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2715856"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693999848 {#4370
        date: 2023-09-06 13:30:48.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Good advice all around! Thanks!\n
      \n
      I’ve also messed around with the ESP8266 and various models of ESP32. Their WiFi time-of-flight stuff is *interesting*. I’ve quite a few projects with both actually! My main complaint is that the GPIO don’t behave nicely (also the esp8266 is a power hog and reboots if you screw up the network stack). They are much slower than I’d expect, and have weird states on boot. It’s not too bad to work around this stuff, but I chose the Pi Pico W so as not to have to explain it.\n
      \n
      It still blows me away that I can easily do public-private key encryption on the ESP32. And graphics. At the same time!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 1
    +score: 0
    +lastActive: DateTime @1694071771 {#4389
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4386 …}
    +nested: Doctrine\ORM\PersistentCollection {#4383 …}
    +votes: Doctrine\ORM\PersistentCollection {#4381 …}
    +reports: Doctrine\ORM\PersistentCollection {#4395 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4397 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4399 …}
    -id: 28234
    -bodyTs: "'actual':36 'advic':2 'also':8,48 'around':4,10,85 'away':107 'bad':82 'behav':46 'blow':105 'boot':77 'chose':90 'complaint':39 'd':70 'easili':111 'encrypt':117 'esp32':18,120 'esp8266':13,50 'expect':71 'explain':101 'flight':24 'good':1 'gpio':43 'graphic':122 'hog':54 'interest':27 'key':116 'main':38 'mess':9 'model':16 'much':66 'network':62 'nice':47 'pi':92 'pico':93 'power':53 'privat':115 'project':33 'public':114 'public-priv':113 'quit':30 'reboot':56 'screw':59 'slower':67 'stack':63 'state':75 'still':104 'stuff':25,87 'thank':5 'time':22,126 'time-of-flight':21 'various':15 've':7,29 'w':94 'weird':74 'wifi':20 'work':84"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/216358"
    +editedAt: null
    +createdAt: DateTimeImmutable @1694071771 {#4392
      date: 2023-09-07 09:29:31.0 +02:00
    }
  }
  +showMagazineName: false
  +showEntryTitle: false
  +showNested: true
  +level: 6
  +canSeeTrash: false
  +dateAsUrl: false
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -authorizationChecker: Symfony\Component\Security\Core\Authorization\AuthorizationChecker {#931 …}
}
user_inline App\Twig\Components\UserInlineComponent 14.0 MiB 0.22 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#8812
  +user: Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +showAvatar: false
}
date App\Twig\Components\DateComponent 14.0 MiB 0.14 ms
Input props
[
  "date" => DateTimeImmutable @1694071771 {#4392
    date: 2023-09-07 09:29:31.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#8867
  +date: DateTimeImmutable @1694071771 {#4392
    date: 2023-09-07 09:29:31.0 +02:00
  }
}
date_edited App\Twig\Components\DateEditedComponent 14.0 MiB 0.09 ms
Input props
[
  "createdAt" => DateTimeImmutable @1694071771 {#4392
    date: 2023-09-07 09:29:31.0 +02:00
  }
  "editedAt" => null
]
Attributes
[]
Component
App\Twig\Components\DateEditedComponent {#8921
  +createdAt: DateTimeImmutable @1694071771 {#4392
    date: 2023-09-07 09:29:31.0 +02:00
  }
  +editedAt: null
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 0.39 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  "width" => 40
  "height" => 40
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#8975
  +width: 40
  +height: 40
  +user: Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +asLink: true
}
vote App\Twig\Components\VoteComponent 14.0 MiB 0.58 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4394
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4372
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4350
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4319
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4284
            +user: Proxies\__CG__\App\Entity\User {#1961 …2}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: App\Entity\EntryComment {#4105
              +user: App\Entity\User {#4088}
              +entry: App\Entity\Entry {#2400}
              +magazine: App\Entity\Magazine {#262}
              +image: null
              +parent: null
              +root: null
              +body: """
                I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
                \n
                You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
                \n
                And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
                """
              +lang: "en"
              +isAdult: false
              +favouriteCount: 0
              +score: 0
              +lastActive: DateTime @1694071778 {#4106
                date: 2023-09-07 09:29:38.0 +02:00
              }
              +ip: null
              +tags: null
              +mentions: [
                "@Saigonauticon@voltage.vn"
              ]
              +children: Doctrine\ORM\PersistentCollection {#4103 …}
              +nested: Doctrine\ORM\PersistentCollection {#4101 …}
              +votes: Doctrine\ORM\PersistentCollection {#4099 …}
              +reports: Doctrine\ORM\PersistentCollection {#4096 …}
              +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
              +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
              -id: 27597
              -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
              +ranking: 0
              +commentCount: 0
              +upVotes: 0
              +downVotes: 0
              +visibility: "visible             "
              +apId: "https://discuss.tchncs.de/comment/2572674"
              +editedAt: DateTimeImmutable @1693564680 {#4111
                date: 2023-09-01 12:38:00.0 +02:00
              }
              +createdAt: DateTimeImmutable @1693564547 {#4109
                date: 2023-09-01 12:35:47.0 +02:00
              }
            }
            +root: App\Entity\EntryComment {#4105}
            +body: """
              They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
              \n
              I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1693906684 {#4282
              date: 2023-09-05 11:38:04.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
              "@rufus@discuss.tchncs.de"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4285 …}
            +nested: Doctrine\ORM\PersistentCollection {#4287 …}
            +votes: Doctrine\ORM\PersistentCollection {#4289 …}
            +reports: Doctrine\ORM\PersistentCollection {#4291 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
            -id: 28063
            -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://voltage.vn/comment/212522"
            +editedAt: null
            +createdAt: DateTimeImmutable @1693906684 {#4283
              date: 2023-09-05 11:38:04.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
            \n
            Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
            \n
            Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
            \n
            Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
            \n
            If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
            \n
            I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693914344 {#4323
            date: 2023-09-05 13:45:44.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4316 …}
          +nested: Doctrine\ORM\PersistentCollection {#4314 …}
          +votes: Doctrine\ORM\PersistentCollection {#4318 …}
          +reports: Doctrine\ORM\PersistentCollection {#4329 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
          -id: 28065
          -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2687935"
          +editedAt: DateTimeImmutable @1693914611 {#4326
            date: 2023-09-05 13:50:11.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693914344 {#4322
            date: 2023-09-05 13:45:44.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
          \n
          I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
          \n
          I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
          \n
          Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693974973 {#4345
          date: 2023-09-06 06:36:13.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4342 …}
        +nested: Doctrine\ORM\PersistentCollection {#4339 …}
        +votes: Doctrine\ORM\PersistentCollection {#4337 …}
        +reports: Doctrine\ORM\PersistentCollection {#4351 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
        -id: 28109
        -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/213919"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693974973 {#4348
          date: 2023-09-06 06:36:13.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
        \n
        > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
        \n
        Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
        \n
        > API-like to abstract away the low-level components\n
        \n
        You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
        \n
        > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
        \n
        I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
        \n
        As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
        \n
        Definitely hope you’ll have fun being involved in that STEM program.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693999848 {#4367
        date: 2023-09-06 13:30:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4364 …}
      +nested: Doctrine\ORM\PersistentCollection {#4361 …}
      +votes: Doctrine\ORM\PersistentCollection {#4359 …}
      +reports: Doctrine\ORM\PersistentCollection {#4373 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
      -id: 28122
      -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2715856"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693999848 {#4370
        date: 2023-09-06 13:30:48.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Good advice all around! Thanks!\n
      \n
      I’ve also messed around with the ESP8266 and various models of ESP32. Their WiFi time-of-flight stuff is *interesting*. I’ve quite a few projects with both actually! My main complaint is that the GPIO don’t behave nicely (also the esp8266 is a power hog and reboots if you screw up the network stack). They are much slower than I’d expect, and have weird states on boot. It’s not too bad to work around this stuff, but I chose the Pi Pico W so as not to have to explain it.\n
      \n
      It still blows me away that I can easily do public-private key encryption on the ESP32. And graphics. At the same time!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 1
    +score: 0
    +lastActive: DateTime @1694071771 {#4389
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4386 …}
    +nested: Doctrine\ORM\PersistentCollection {#4383 …}
    +votes: Doctrine\ORM\PersistentCollection {#4381 …}
    +reports: Doctrine\ORM\PersistentCollection {#4395 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4397 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4399 …}
    -id: 28234
    -bodyTs: "'actual':36 'advic':2 'also':8,48 'around':4,10,85 'away':107 'bad':82 'behav':46 'blow':105 'boot':77 'chose':90 'complaint':39 'd':70 'easili':111 'encrypt':117 'esp32':18,120 'esp8266':13,50 'expect':71 'explain':101 'flight':24 'good':1 'gpio':43 'graphic':122 'hog':54 'interest':27 'key':116 'main':38 'mess':9 'model':16 'much':66 'network':62 'nice':47 'pi':92 'pico':93 'power':53 'privat':115 'project':33 'public':114 'public-priv':113 'quit':30 'reboot':56 'screw':59 'slower':67 'stack':63 'state':75 'still':104 'stuff':25,87 'thank':5 'time':22,126 'time-of-flight':21 'various':15 've':7,29 'w':94 'weird':74 'wifi':20 'work':84"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/216358"
    +editedAt: null
    +createdAt: DateTimeImmutable @1694071771 {#4392
      date: 2023-09-07 09:29:31.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\VoteComponent {#9058
  +subject: App\Entity\EntryComment {#4394
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4372
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4350
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4319
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4284
            +user: Proxies\__CG__\App\Entity\User {#1961 …2}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: App\Entity\EntryComment {#4105
              +user: App\Entity\User {#4088}
              +entry: App\Entity\Entry {#2400}
              +magazine: App\Entity\Magazine {#262}
              +image: null
              +parent: null
              +root: null
              +body: """
                I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
                \n
                You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
                \n
                And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
                """
              +lang: "en"
              +isAdult: false
              +favouriteCount: 0
              +score: 0
              +lastActive: DateTime @1694071778 {#4106
                date: 2023-09-07 09:29:38.0 +02:00
              }
              +ip: null
              +tags: null
              +mentions: [
                "@Saigonauticon@voltage.vn"
              ]
              +children: Doctrine\ORM\PersistentCollection {#4103 …}
              +nested: Doctrine\ORM\PersistentCollection {#4101 …}
              +votes: Doctrine\ORM\PersistentCollection {#4099 …}
              +reports: Doctrine\ORM\PersistentCollection {#4096 …}
              +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
              +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
              -id: 27597
              -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
              +ranking: 0
              +commentCount: 0
              +upVotes: 0
              +downVotes: 0
              +visibility: "visible             "
              +apId: "https://discuss.tchncs.de/comment/2572674"
              +editedAt: DateTimeImmutable @1693564680 {#4111
                date: 2023-09-01 12:38:00.0 +02:00
              }
              +createdAt: DateTimeImmutable @1693564547 {#4109
                date: 2023-09-01 12:35:47.0 +02:00
              }
            }
            +root: App\Entity\EntryComment {#4105}
            +body: """
              They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
              \n
              I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1693906684 {#4282
              date: 2023-09-05 11:38:04.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
              "@rufus@discuss.tchncs.de"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4285 …}
            +nested: Doctrine\ORM\PersistentCollection {#4287 …}
            +votes: Doctrine\ORM\PersistentCollection {#4289 …}
            +reports: Doctrine\ORM\PersistentCollection {#4291 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
            -id: 28063
            -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://voltage.vn/comment/212522"
            +editedAt: null
            +createdAt: DateTimeImmutable @1693906684 {#4283
              date: 2023-09-05 11:38:04.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
            \n
            Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
            \n
            Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
            \n
            Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
            \n
            If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
            \n
            I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693914344 {#4323
            date: 2023-09-05 13:45:44.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4316 …}
          +nested: Doctrine\ORM\PersistentCollection {#4314 …}
          +votes: Doctrine\ORM\PersistentCollection {#4318 …}
          +reports: Doctrine\ORM\PersistentCollection {#4329 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
          -id: 28065
          -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2687935"
          +editedAt: DateTimeImmutable @1693914611 {#4326
            date: 2023-09-05 13:50:11.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693914344 {#4322
            date: 2023-09-05 13:45:44.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
          \n
          I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
          \n
          I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
          \n
          Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693974973 {#4345
          date: 2023-09-06 06:36:13.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4342 …}
        +nested: Doctrine\ORM\PersistentCollection {#4339 …}
        +votes: Doctrine\ORM\PersistentCollection {#4337 …}
        +reports: Doctrine\ORM\PersistentCollection {#4351 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
        -id: 28109
        -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/213919"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693974973 {#4348
          date: 2023-09-06 06:36:13.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
        \n
        > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
        \n
        Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
        \n
        > API-like to abstract away the low-level components\n
        \n
        You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
        \n
        > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
        \n
        I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
        \n
        As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
        \n
        Definitely hope you’ll have fun being involved in that STEM program.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693999848 {#4367
        date: 2023-09-06 13:30:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4364 …}
      +nested: Doctrine\ORM\PersistentCollection {#4361 …}
      +votes: Doctrine\ORM\PersistentCollection {#4359 …}
      +reports: Doctrine\ORM\PersistentCollection {#4373 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
      -id: 28122
      -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2715856"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693999848 {#4370
        date: 2023-09-06 13:30:48.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Good advice all around! Thanks!\n
      \n
      I’ve also messed around with the ESP8266 and various models of ESP32. Their WiFi time-of-flight stuff is *interesting*. I’ve quite a few projects with both actually! My main complaint is that the GPIO don’t behave nicely (also the esp8266 is a power hog and reboots if you screw up the network stack). They are much slower than I’d expect, and have weird states on boot. It’s not too bad to work around this stuff, but I chose the Pi Pico W so as not to have to explain it.\n
      \n
      It still blows me away that I can easily do public-private key encryption on the ESP32. And graphics. At the same time!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 1
    +score: 0
    +lastActive: DateTime @1694071771 {#4389
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4386 …}
    +nested: Doctrine\ORM\PersistentCollection {#4383 …}
    +votes: Doctrine\ORM\PersistentCollection {#4381 …}
    +reports: Doctrine\ORM\PersistentCollection {#4395 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4397 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4399 …}
    -id: 28234
    -bodyTs: "'actual':36 'advic':2 'also':8,48 'around':4,10,85 'away':107 'bad':82 'behav':46 'blow':105 'boot':77 'chose':90 'complaint':39 'd':70 'easili':111 'encrypt':117 'esp32':18,120 'esp8266':13,50 'expect':71 'explain':101 'flight':24 'good':1 'gpio':43 'graphic':122 'hog':54 'interest':27 'key':116 'main':38 'mess':9 'model':16 'much':66 'network':62 'nice':47 'pi':92 'pico':93 'power':53 'privat':115 'project':33 'public':114 'public-priv':113 'quit':30 'reboot':56 'screw':59 'slower':67 'stack':63 'state':75 'still':104 'stuff':25,87 'thank':5 'time':22,126 'time-of-flight':21 'various':15 've':7,29 'w':94 'weird':74 'wifi':20 'work':84"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/216358"
    +editedAt: null
    +createdAt: DateTimeImmutable @1694071771 {#4392
      date: 2023-09-07 09:29:31.0 +02:00
    }
  }
  +formDest: "entry_comment"
  +showDownvote: true
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
boost App\Twig\Components\BoostComponent 14.0 MiB 0.75 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4394
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4372
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4350
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4319
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4284
            +user: Proxies\__CG__\App\Entity\User {#1961 …2}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: App\Entity\EntryComment {#4105
              +user: App\Entity\User {#4088}
              +entry: App\Entity\Entry {#2400}
              +magazine: App\Entity\Magazine {#262}
              +image: null
              +parent: null
              +root: null
              +body: """
                I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
                \n
                You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
                \n
                And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
                """
              +lang: "en"
              +isAdult: false
              +favouriteCount: 0
              +score: 0
              +lastActive: DateTime @1694071778 {#4106
                date: 2023-09-07 09:29:38.0 +02:00
              }
              +ip: null
              +tags: null
              +mentions: [
                "@Saigonauticon@voltage.vn"
              ]
              +children: Doctrine\ORM\PersistentCollection {#4103 …}
              +nested: Doctrine\ORM\PersistentCollection {#4101 …}
              +votes: Doctrine\ORM\PersistentCollection {#4099 …}
              +reports: Doctrine\ORM\PersistentCollection {#4096 …}
              +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
              +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
              -id: 27597
              -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
              +ranking: 0
              +commentCount: 0
              +upVotes: 0
              +downVotes: 0
              +visibility: "visible             "
              +apId: "https://discuss.tchncs.de/comment/2572674"
              +editedAt: DateTimeImmutable @1693564680 {#4111
                date: 2023-09-01 12:38:00.0 +02:00
              }
              +createdAt: DateTimeImmutable @1693564547 {#4109
                date: 2023-09-01 12:35:47.0 +02:00
              }
            }
            +root: App\Entity\EntryComment {#4105}
            +body: """
              They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
              \n
              I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1693906684 {#4282
              date: 2023-09-05 11:38:04.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
              "@rufus@discuss.tchncs.de"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4285 …}
            +nested: Doctrine\ORM\PersistentCollection {#4287 …}
            +votes: Doctrine\ORM\PersistentCollection {#4289 …}
            +reports: Doctrine\ORM\PersistentCollection {#4291 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
            -id: 28063
            -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://voltage.vn/comment/212522"
            +editedAt: null
            +createdAt: DateTimeImmutable @1693906684 {#4283
              date: 2023-09-05 11:38:04.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
            \n
            Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
            \n
            Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
            \n
            Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
            \n
            If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
            \n
            I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693914344 {#4323
            date: 2023-09-05 13:45:44.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4316 …}
          +nested: Doctrine\ORM\PersistentCollection {#4314 …}
          +votes: Doctrine\ORM\PersistentCollection {#4318 …}
          +reports: Doctrine\ORM\PersistentCollection {#4329 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
          -id: 28065
          -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2687935"
          +editedAt: DateTimeImmutable @1693914611 {#4326
            date: 2023-09-05 13:50:11.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693914344 {#4322
            date: 2023-09-05 13:45:44.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
          \n
          I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
          \n
          I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
          \n
          Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693974973 {#4345
          date: 2023-09-06 06:36:13.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4342 …}
        +nested: Doctrine\ORM\PersistentCollection {#4339 …}
        +votes: Doctrine\ORM\PersistentCollection {#4337 …}
        +reports: Doctrine\ORM\PersistentCollection {#4351 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
        -id: 28109
        -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/213919"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693974973 {#4348
          date: 2023-09-06 06:36:13.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
        \n
        > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
        \n
        Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
        \n
        > API-like to abstract away the low-level components\n
        \n
        You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
        \n
        > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
        \n
        I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
        \n
        As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
        \n
        Definitely hope you’ll have fun being involved in that STEM program.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693999848 {#4367
        date: 2023-09-06 13:30:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4364 …}
      +nested: Doctrine\ORM\PersistentCollection {#4361 …}
      +votes: Doctrine\ORM\PersistentCollection {#4359 …}
      +reports: Doctrine\ORM\PersistentCollection {#4373 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
      -id: 28122
      -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2715856"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693999848 {#4370
        date: 2023-09-06 13:30:48.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Good advice all around! Thanks!\n
      \n
      I’ve also messed around with the ESP8266 and various models of ESP32. Their WiFi time-of-flight stuff is *interesting*. I’ve quite a few projects with both actually! My main complaint is that the GPIO don’t behave nicely (also the esp8266 is a power hog and reboots if you screw up the network stack). They are much slower than I’d expect, and have weird states on boot. It’s not too bad to work around this stuff, but I chose the Pi Pico W so as not to have to explain it.\n
      \n
      It still blows me away that I can easily do public-private key encryption on the ESP32. And graphics. At the same time!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 1
    +score: 0
    +lastActive: DateTime @1694071771 {#4389
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4386 …}
    +nested: Doctrine\ORM\PersistentCollection {#4383 …}
    +votes: Doctrine\ORM\PersistentCollection {#4381 …}
    +reports: Doctrine\ORM\PersistentCollection {#4395 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4397 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4399 …}
    -id: 28234
    -bodyTs: "'actual':36 'advic':2 'also':8,48 'around':4,10,85 'away':107 'bad':82 'behav':46 'blow':105 'boot':77 'chose':90 'complaint':39 'd':70 'easili':111 'encrypt':117 'esp32':18,120 'esp8266':13,50 'expect':71 'explain':101 'flight':24 'good':1 'gpio':43 'graphic':122 'hog':54 'interest':27 'key':116 'main':38 'mess':9 'model':16 'much':66 'network':62 'nice':47 'pi':92 'pico':93 'power':53 'privat':115 'project':33 'public':114 'public-priv':113 'quit':30 'reboot':56 'screw':59 'slower':67 'stack':63 'state':75 'still':104 'stuff':25,87 'thank':5 'time':22,126 'time-of-flight':21 'various':15 've':7,29 'w':94 'weird':74 'wifi':20 'work':84"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/216358"
    +editedAt: null
    +createdAt: DateTimeImmutable @1694071771 {#4392
      date: 2023-09-07 09:29:31.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\BoostComponent {#9115
  +formDest: "entry_comment"
  +subject: App\Entity\EntryComment {#4394
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4372
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4350
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4319
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4284
            +user: Proxies\__CG__\App\Entity\User {#1961 …2}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: App\Entity\EntryComment {#4105
              +user: App\Entity\User {#4088}
              +entry: App\Entity\Entry {#2400}
              +magazine: App\Entity\Magazine {#262}
              +image: null
              +parent: null
              +root: null
              +body: """
                I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
                \n
                You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
                \n
                And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
                """
              +lang: "en"
              +isAdult: false
              +favouriteCount: 0
              +score: 0
              +lastActive: DateTime @1694071778 {#4106
                date: 2023-09-07 09:29:38.0 +02:00
              }
              +ip: null
              +tags: null
              +mentions: [
                "@Saigonauticon@voltage.vn"
              ]
              +children: Doctrine\ORM\PersistentCollection {#4103 …}
              +nested: Doctrine\ORM\PersistentCollection {#4101 …}
              +votes: Doctrine\ORM\PersistentCollection {#4099 …}
              +reports: Doctrine\ORM\PersistentCollection {#4096 …}
              +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
              +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
              -id: 27597
              -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
              +ranking: 0
              +commentCount: 0
              +upVotes: 0
              +downVotes: 0
              +visibility: "visible             "
              +apId: "https://discuss.tchncs.de/comment/2572674"
              +editedAt: DateTimeImmutable @1693564680 {#4111
                date: 2023-09-01 12:38:00.0 +02:00
              }
              +createdAt: DateTimeImmutable @1693564547 {#4109
                date: 2023-09-01 12:35:47.0 +02:00
              }
            }
            +root: App\Entity\EntryComment {#4105}
            +body: """
              They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
              \n
              I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1693906684 {#4282
              date: 2023-09-05 11:38:04.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
              "@rufus@discuss.tchncs.de"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4285 …}
            +nested: Doctrine\ORM\PersistentCollection {#4287 …}
            +votes: Doctrine\ORM\PersistentCollection {#4289 …}
            +reports: Doctrine\ORM\PersistentCollection {#4291 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
            -id: 28063
            -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://voltage.vn/comment/212522"
            +editedAt: null
            +createdAt: DateTimeImmutable @1693906684 {#4283
              date: 2023-09-05 11:38:04.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
            \n
            Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
            \n
            Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
            \n
            Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
            \n
            If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
            \n
            I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693914344 {#4323
            date: 2023-09-05 13:45:44.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4316 …}
          +nested: Doctrine\ORM\PersistentCollection {#4314 …}
          +votes: Doctrine\ORM\PersistentCollection {#4318 …}
          +reports: Doctrine\ORM\PersistentCollection {#4329 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
          -id: 28065
          -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2687935"
          +editedAt: DateTimeImmutable @1693914611 {#4326
            date: 2023-09-05 13:50:11.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693914344 {#4322
            date: 2023-09-05 13:45:44.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
          \n
          I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
          \n
          I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
          \n
          Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693974973 {#4345
          date: 2023-09-06 06:36:13.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4342 …}
        +nested: Doctrine\ORM\PersistentCollection {#4339 …}
        +votes: Doctrine\ORM\PersistentCollection {#4337 …}
        +reports: Doctrine\ORM\PersistentCollection {#4351 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
        -id: 28109
        -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/213919"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693974973 {#4348
          date: 2023-09-06 06:36:13.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
        \n
        > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
        \n
        Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
        \n
        > API-like to abstract away the low-level components\n
        \n
        You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
        \n
        > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
        \n
        I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
        \n
        As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
        \n
        Definitely hope you’ll have fun being involved in that STEM program.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693999848 {#4367
        date: 2023-09-06 13:30:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4364 …}
      +nested: Doctrine\ORM\PersistentCollection {#4361 …}
      +votes: Doctrine\ORM\PersistentCollection {#4359 …}
      +reports: Doctrine\ORM\PersistentCollection {#4373 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
      -id: 28122
      -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2715856"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693999848 {#4370
        date: 2023-09-06 13:30:48.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Good advice all around! Thanks!\n
      \n
      I’ve also messed around with the ESP8266 and various models of ESP32. Their WiFi time-of-flight stuff is *interesting*. I’ve quite a few projects with both actually! My main complaint is that the GPIO don’t behave nicely (also the esp8266 is a power hog and reboots if you screw up the network stack). They are much slower than I’d expect, and have weird states on boot. It’s not too bad to work around this stuff, but I chose the Pi Pico W so as not to have to explain it.\n
      \n
      It still blows me away that I can easily do public-private key encryption on the ESP32. And graphics. At the same time!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 1
    +score: 0
    +lastActive: DateTime @1694071771 {#4389
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4386 …}
    +nested: Doctrine\ORM\PersistentCollection {#4383 …}
    +votes: Doctrine\ORM\PersistentCollection {#4381 …}
    +reports: Doctrine\ORM\PersistentCollection {#4395 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4397 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4399 …}
    -id: 28234
    -bodyTs: "'actual':36 'advic':2 'also':8,48 'around':4,10,85 'away':107 'bad':82 'behav':46 'blow':105 'boot':77 'chose':90 'complaint':39 'd':70 'easili':111 'encrypt':117 'esp32':18,120 'esp8266':13,50 'expect':71 'explain':101 'flight':24 'good':1 'gpio':43 'graphic':122 'hog':54 'interest':27 'key':116 'main':38 'mess':9 'model':16 'much':66 'network':62 'nice':47 'pi':92 'pico':93 'power':53 'privat':115 'project':33 'public':114 'public-priv':113 'quit':30 'reboot':56 'screw':59 'slower':67 'stack':63 'state':75 'still':104 'stuff':25,87 'thank':5 'time':22,126 'time-of-flight':21 'various':15 've':7,29 'w':94 'weird':74 'wifi':20 'work':84"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/216358"
    +editedAt: null
    +createdAt: DateTimeImmutable @1694071771 {#4392
      date: 2023-09-07 09:29:31.0 +02:00
    }
  }
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
entry_comments_nested App\Twig\Components\EntryCommentsNestedComponent 14.0 MiB 0.33 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4394
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4372
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4350
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4319
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4284
            +user: Proxies\__CG__\App\Entity\User {#1961 …2}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: App\Entity\EntryComment {#4105
              +user: App\Entity\User {#4088}
              +entry: App\Entity\Entry {#2400}
              +magazine: App\Entity\Magazine {#262}
              +image: null
              +parent: null
              +root: null
              +body: """
                I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
                \n
                You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
                \n
                And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
                """
              +lang: "en"
              +isAdult: false
              +favouriteCount: 0
              +score: 0
              +lastActive: DateTime @1694071778 {#4106
                date: 2023-09-07 09:29:38.0 +02:00
              }
              +ip: null
              +tags: null
              +mentions: [
                "@Saigonauticon@voltage.vn"
              ]
              +children: Doctrine\ORM\PersistentCollection {#4103 …}
              +nested: Doctrine\ORM\PersistentCollection {#4101 …}
              +votes: Doctrine\ORM\PersistentCollection {#4099 …}
              +reports: Doctrine\ORM\PersistentCollection {#4096 …}
              +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
              +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
              -id: 27597
              -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
              +ranking: 0
              +commentCount: 0
              +upVotes: 0
              +downVotes: 0
              +visibility: "visible             "
              +apId: "https://discuss.tchncs.de/comment/2572674"
              +editedAt: DateTimeImmutable @1693564680 {#4111
                date: 2023-09-01 12:38:00.0 +02:00
              }
              +createdAt: DateTimeImmutable @1693564547 {#4109
                date: 2023-09-01 12:35:47.0 +02:00
              }
            }
            +root: App\Entity\EntryComment {#4105}
            +body: """
              They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
              \n
              I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1693906684 {#4282
              date: 2023-09-05 11:38:04.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
              "@rufus@discuss.tchncs.de"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4285 …}
            +nested: Doctrine\ORM\PersistentCollection {#4287 …}
            +votes: Doctrine\ORM\PersistentCollection {#4289 …}
            +reports: Doctrine\ORM\PersistentCollection {#4291 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
            -id: 28063
            -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://voltage.vn/comment/212522"
            +editedAt: null
            +createdAt: DateTimeImmutable @1693906684 {#4283
              date: 2023-09-05 11:38:04.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
            \n
            Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
            \n
            Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
            \n
            Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
            \n
            If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
            \n
            I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693914344 {#4323
            date: 2023-09-05 13:45:44.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4316 …}
          +nested: Doctrine\ORM\PersistentCollection {#4314 …}
          +votes: Doctrine\ORM\PersistentCollection {#4318 …}
          +reports: Doctrine\ORM\PersistentCollection {#4329 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
          -id: 28065
          -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2687935"
          +editedAt: DateTimeImmutable @1693914611 {#4326
            date: 2023-09-05 13:50:11.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693914344 {#4322
            date: 2023-09-05 13:45:44.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
          \n
          I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
          \n
          I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
          \n
          Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693974973 {#4345
          date: 2023-09-06 06:36:13.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4342 …}
        +nested: Doctrine\ORM\PersistentCollection {#4339 …}
        +votes: Doctrine\ORM\PersistentCollection {#4337 …}
        +reports: Doctrine\ORM\PersistentCollection {#4351 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
        -id: 28109
        -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/213919"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693974973 {#4348
          date: 2023-09-06 06:36:13.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
        \n
        > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
        \n
        Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
        \n
        > API-like to abstract away the low-level components\n
        \n
        You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
        \n
        > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
        \n
        I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
        \n
        As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
        \n
        Definitely hope you’ll have fun being involved in that STEM program.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693999848 {#4367
        date: 2023-09-06 13:30:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4364 …}
      +nested: Doctrine\ORM\PersistentCollection {#4361 …}
      +votes: Doctrine\ORM\PersistentCollection {#4359 …}
      +reports: Doctrine\ORM\PersistentCollection {#4373 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
      -id: 28122
      -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2715856"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693999848 {#4370
        date: 2023-09-06 13:30:48.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Good advice all around! Thanks!\n
      \n
      I’ve also messed around with the ESP8266 and various models of ESP32. Their WiFi time-of-flight stuff is *interesting*. I’ve quite a few projects with both actually! My main complaint is that the GPIO don’t behave nicely (also the esp8266 is a power hog and reboots if you screw up the network stack). They are much slower than I’d expect, and have weird states on boot. It’s not too bad to work around this stuff, but I chose the Pi Pico W so as not to have to explain it.\n
      \n
      It still blows me away that I can easily do public-private key encryption on the ESP32. And graphics. At the same time!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 1
    +score: 0
    +lastActive: DateTime @1694071771 {#4389
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4386 …}
    +nested: Doctrine\ORM\PersistentCollection {#4383 …}
    +votes: Doctrine\ORM\PersistentCollection {#4381 …}
    +reports: Doctrine\ORM\PersistentCollection {#4395 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4397 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4399 …}
    -id: 28234
    -bodyTs: "'actual':36 'advic':2 'also':8,48 'around':4,10,85 'away':107 'bad':82 'behav':46 'blow':105 'boot':77 'chose':90 'complaint':39 'd':70 'easili':111 'encrypt':117 'esp32':18,120 'esp8266':13,50 'expect':71 'explain':101 'flight':24 'good':1 'gpio':43 'graphic':122 'hog':54 'interest':27 'key':116 'main':38 'mess':9 'model':16 'much':66 'network':62 'nice':47 'pi':92 'pico':93 'power':53 'privat':115 'project':33 'public':114 'public-priv':113 'quit':30 'reboot':56 'screw':59 'slower':67 'stack':63 'state':75 'still':104 'stuff':25,87 'thank':5 'time':22,126 'time-of-flight':21 'various':15 've':7,29 'w':94 'weird':74 'wifi':20 'work':84"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/216358"
    +editedAt: null
    +createdAt: DateTimeImmutable @1694071771 {#4392
      date: 2023-09-07 09:29:31.0 +02:00
    }
  }
  "level" => 6
  "showNested" => true
  "view" => "tree"
]
Attributes
[
  "showNested" => true
]
Component
App\Twig\Components\EntryCommentsNestedComponent {#9355
  +comment: App\Entity\EntryComment {#4394
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4372
      +user: App\Entity\User {#4088
        +avatar: null
        +cover: null
        +email: "rufus@discuss.tchncs.de"
        +username: "@rufus@discuss.tchncs.de"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1729234169 {#4110
          date: 2024-10-18 08:49:29.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4087 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4085 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4083 …}
        +entries: Doctrine\ORM\PersistentCollection {#4081 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4079 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4138 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4139 …}
        +posts: Doctrine\ORM\PersistentCollection {#4141 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4143 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4145 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4147 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4149 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4151 …}
        +follows: Doctrine\ORM\PersistentCollection {#4153 …}
        +followers: Doctrine\ORM\PersistentCollection {#4155 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4157 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4159 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4161 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4163 …}
        +reports: Doctrine\ORM\PersistentCollection {#4165 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4167 …}
        +violations: Doctrine\ORM\PersistentCollection {#4169 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4171 …}
        +awards: Doctrine\ORM\PersistentCollection {#4173 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4175 …}
        +categories: Doctrine\ORM\PersistentCollection {#4177 …}
        -id: 22773
        -password: "$2y$13$YtqjsSR7mfcfB2kA1OhEJuPN0/kNwhgMvYVp/KHXpvvMO6deBxc3i"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4179 …}
        +apId: "rufus@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/u/rufus"
        +apPublicUrl: "https://discuss.tchncs.de/u/rufus"
        +apFollowersUrl: null
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "rufus"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1728254912 {#4107
          date: 2024-10-07 00:48:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689082128 {#4100
          date: 2023-07-11 15:28:48.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4350
        +user: Proxies\__CG__\App\Entity\User {#1961 …2}
        +entry: App\Entity\Entry {#2400}
        +magazine: App\Entity\Magazine {#262}
        +image: null
        +parent: App\Entity\EntryComment {#4319
          +user: App\Entity\User {#4088}
          +entry: App\Entity\Entry {#2400}
          +magazine: App\Entity\Magazine {#262}
          +image: null
          +parent: App\Entity\EntryComment {#4284
            +user: Proxies\__CG__\App\Entity\User {#1961 …2}
            +entry: App\Entity\Entry {#2400}
            +magazine: App\Entity\Magazine {#262}
            +image: null
            +parent: App\Entity\EntryComment {#4105
              +user: App\Entity\User {#4088}
              +entry: App\Entity\Entry {#2400}
              +magazine: App\Entity\Magazine {#262}
              +image: null
              +parent: null
              +root: null
              +body: """
                I think mecanum wheels slip quite a bit. So I’m not sure how effective those encoders are. But I’ve only ever tried 3d-printed ones. So I’m not super sure.\n
                \n
                You’re sure your STEM students are ready to handle the LiDAR? Manage point clouds, do the arithmetic, path planning etc? We had a practical course with little robots. But they had 3 of those sharp distance sensors at the front and a bumper with a switch. This was enough to teach many concepts and also enough to implement for the students for something that was just a project and not a full time job. But I’m sure that depends on what exactly you want to teach…\n
                \n
                And our robots hat the motor drivers (h-bridges) replaceable on socket terminals because every so often someone wasn’t very clever or didn’t listen in the lectures.
                """
              +lang: "en"
              +isAdult: false
              +favouriteCount: 0
              +score: 0
              +lastActive: DateTime @1694071778 {#4106
                date: 2023-09-07 09:29:38.0 +02:00
              }
              +ip: null
              +tags: null
              +mentions: [
                "@Saigonauticon@voltage.vn"
              ]
              +children: Doctrine\ORM\PersistentCollection {#4103 …}
              +nested: Doctrine\ORM\PersistentCollection {#4101 …}
              +votes: Doctrine\ORM\PersistentCollection {#4099 …}
              +reports: Doctrine\ORM\PersistentCollection {#4096 …}
              +favourites: Doctrine\ORM\PersistentCollection {#4092 …}
              +notifications: Doctrine\ORM\PersistentCollection {#4090 …}
              -id: 27597
              -bodyTs: "'3':67 '3d':26 '3d-printed':25 'also':90 'arithmet':52 'bit':8 'bridg':132 'bumper':78 'clever':145 'cloud':49 'concept':88 'cours':60 'depend':115 'didn':147 'distanc':71 'driver':129 'effect':15 'encod':17 'enough':84,91 'etc':55 'ever':23 'everi':138 'exact':118 'front':75 'full':107 'h':131 'h-bridg':130 'handl':44 'hat':126 'implement':93 'job':109 'lectur':152 'lidar':46 'listen':149 'littl':62 'm':11,31,112 'manag':47 'mani':87 'mecanum':3 'motor':128 'often':140 'one':28 'path':53 'plan':54 'point':48 'practic':59 'print':27 'project':103 'quit':6 're':36 'readi':42 'replac':133 'robot':63,125 'sensor':72 'sharp':70 'slip':5 'socket':135 'someon':141 'someth':98 'stem':39 'student':40,96 'super':33 'sure':13,34,37,113 'switch':81 'teach':86,122 'termin':136 'think':2 'time':108 'tri':24 've':21 'want':120 'wasn':142 'wheel':4"
              +ranking: 0
              +commentCount: 0
              +upVotes: 0
              +downVotes: 0
              +visibility: "visible             "
              +apId: "https://discuss.tchncs.de/comment/2572674"
              +editedAt: DateTimeImmutable @1693564680 {#4111
                date: 2023-09-01 12:38:00.0 +02:00
              }
              +createdAt: DateTimeImmutable @1693564547 {#4109
                date: 2023-09-01 12:35:47.0 +02:00
              }
            }
            +root: App\Entity\EntryComment {#4105}
            +body: """
              They’re university software engineering students, probably a year or two into their degrees. I’m hoping to provide the robots as completed units that are controlled via API, because we’re not likely to get many students with electrical, mechanical, or embedded backgrounds. You’re right about the complexity though, and that’s something I’ve been thinking about – I guess I’ll start out with a bit of optimism regarding their talents, and scale back if needed :D\n
              \n
              I don’t really have a scope, budget, timeline, or audience properly defined for this project – in short my client has a STEM program for building and interacting with digital maps, but it’s *way too boring* and I’m determined to breathe some life into it. So I’m going to have to play a lot of things by ear.
              """
            +lang: "en"
            +isAdult: false
            +favouriteCount: 0
            +score: 0
            +lastActive: DateTime @1693906684 {#4282
              date: 2023-09-05 11:38:04.0 +02:00
            }
            +ip: null
            +tags: null
            +mentions: [
              "@Saigonauticon@voltage.vn"
              "@rufus@discuss.tchncs.de"
            ]
            +children: Doctrine\ORM\PersistentCollection {#4285 …}
            +nested: Doctrine\ORM\PersistentCollection {#4287 …}
            +votes: Doctrine\ORM\PersistentCollection {#4289 …}
            +reports: Doctrine\ORM\PersistentCollection {#4291 …}
            +favourites: Doctrine\ORM\PersistentCollection {#4293 …}
            +notifications: Doctrine\ORM\PersistentCollection {#4295 …}
            -id: 28063
            -bodyTs: "'api':29 'audienc':91 'back':77 'background':44 'bit':69 'bore':117 'breath':123 'budget':88 'build':106 'client':100 'complet':23 'complex':50 'control':27 'd':80 'defin':93 'degre':14 'determin':121 'digit':110 'ear':141 'electr':40 'embed':43 'engin':5 'get':36 'go':131 'guess':62 'hope':17 'interact':108 'life':125 'like':34 'll':64 'lot':137 'm':16,120,130 'mani':37 'map':111 'mechan':41 'need':79 'optim':71 'play':135 'probabl':7 'program':104 'project':96 'proper':92 'provid':19 're':2,32,46 'realli':84 'regard':72 'right':47 'robot':21 'scale':76 'scope':87 'short':98 'softwar':4 'someth':55 'start':65 'stem':103 'student':6,38 'talent':74 'thing':139 'think':59 'though':51 'timelin':89 'two':11 'unit':24 'univers':3 've':57 'via':28 'way':115 'year':9"
            +ranking: 0
            +commentCount: 0
            +upVotes: 0
            +downVotes: 0
            +visibility: "visible             "
            +apId: "https://voltage.vn/comment/212522"
            +editedAt: null
            +createdAt: DateTimeImmutable @1693906684 {#4283
              date: 2023-09-05 11:38:04.0 +02:00
            }
          }
          +root: App\Entity\EntryComment {#4105}
          +body: """
            Well, kids / young people / students will surprise you anyways. No matter what you planned ahead. I think teaching this way just requires you to stay flexible and try things with the students and see what works. University students will benefit from a little challenge, but it shouldn’t be impossible and get them frustrated. I’ve never taught myself, but I bet it’s difficult to hit that balance.\n
            \n
            Programming little robots is awesome, though. I think it’s on a whole other level to see robots move and do tasks, than to look at your screen and program something that changes a few pixels there. My university course was more related to embedded devices and closer to the electronics. It teaches you valuable lessons when forced to interact with some electronics, real-world physics, constrained resources and you need to get your maths right. Usually students are concerned with something like Java, learning object-oriented programming or handling some big frameworks. Or learning maths. And robotics teaches you to really pay attention, combine different skill-sets and do things without an easy route available.\n
            \n
            Maybe it’s just me who likes electronics too much. But I’m sure the kind of motivation you get by watching a real robot move and it runs your code, is unique. And kind of universal. You can do this in pre-school or in university to spark their imagination and motivation.\n
            \n
            Your task is a bit different. If you’re teaching something like simultaneous localization and mapping and the students also have to deal with all the robotics, sensors and real-word problems, this might be more of an ordeal for them than fun. Even dealing with noisy sensor values is a hassle until you get to grasp the bigger picture.\n
            \n
            If you’re giving them access to an API, you can choose and adjust what kind of abstraction you’re providing them. Give them something high-level or have them do more work. You could prepare most of the implementation and adjust the level of detail while teaching. Maybe skip something and give them working code via your API so they can focus on the problem they’re actually supposed to learn. You can also do it the other way round. Let them start with all low level stuff handled for them and learn the big concepts. Then let them dig down and see what your API functions have abstracted away until then. This way around you won’t run out of time.\n
            \n
            I’m sure including actual robotics is going to get them more motivated in contrast to running a simulation.
            """
          +lang: "en"
          +isAdult: false
          +favouriteCount: 0
          +score: 0
          +lastActive: DateTime @1693914344 {#4323
            date: 2023-09-05 13:45:44.0 +02:00
          }
          +ip: null
          +tags: null
          +mentions: [
            "@Saigonauticon@voltage.vn"
            "@rufus@discuss.tchncs.de"
          ]
          +children: Doctrine\ORM\PersistentCollection {#4316 …}
          +nested: Doctrine\ORM\PersistentCollection {#4314 …}
          +votes: Doctrine\ORM\PersistentCollection {#4318 …}
          +reports: Doctrine\ORM\PersistentCollection {#4329 …}
          +favourites: Doctrine\ORM\PersistentCollection {#4331 …}
          +notifications: Doctrine\ORM\PersistentCollection {#4333 …}
          -id: 28065
          -bodyTs: "'abstract':321,414 'access':309 'actual':373,432 'adjust':317,346 'ahead':15 'also':262,379 'anyway':9 'api':312,363,411 'around':420 'attent':175 'avail':188 'away':415 'awesom':74 'balanc':69 'benefit':40 'bet':62 'big':163,400 'bigger':302 'bit':247 'challeng':44 'chang':102 'choos':315 'closer':117 'code':219,360 'combin':176 'concept':401 'concern':150 'constrain':137 'contrast':442 'could':339 'cours':109 'deal':265,288 'detail':350 'devic':115 'differ':177,248 'difficult':65 'dig':405 'easi':186 'electron':120,132,196 'embed':114 'even':287 'flexibl':26 'focus':367 'forc':127 'framework':164 'frustrat':54 'fun':286 'function':412 'get':52,143,208,298,437 'give':307,326,357 'go':435 'grasp':300 'handl':161,394 'hassl':295 'high':330 'high-level':329 'hit':67 'imagin':240 'implement':344 'imposs':50 'includ':431 'interact':129 'java':154 'kid':2 'kind':204,223,319 'learn':155,166,376,398 'lesson':125 'let':386,403 'level':84,331,348,392 'like':153,195,254 'littl':43,71 'local':256 'look':94 'low':391 'm':201,429 'map':258 'math':145,167 'matter':11 'mayb':189,353 'might':277 'motiv':206,242,440 'move':88,214 'much':198 'need':141 'never':57 'noisi':290 'object':157 'object-ori':156 'ordeal':282 'orient':158 'pay':174 'peopl':4 'physic':136 'pictur':303 'pixel':105 'plan':14 'pre':232 'pre-school':231 'prepar':340 'problem':275,370 'program':70,99,159 'provid':324 're':251,306,323,372 'real':134,212,273 'real-word':272 'real-world':133 'realli':173 'relat':112 'requir':22 'resourc':138 'right':146 'robot':72,87,169,213,269,433 'round':385 'rout':187 'run':217,424,444 'school':233 'screen':97 'see':34,86,408 'sensor':270,291 'set':180 'shouldn':47 'simul':446 'simultan':255 'skill':179 'skill-set':178 'skip':354 'someth':100,152,253,328,355 'spark':238 'start':388 'stay':25 'student':5,32,38,148,261 'stuff':393 'suppos':374 'sure':202,430 'surpris':7 'task':91,244 'taught':58 'teach':18,122,170,252,352 'thing':29,183 'think':17,77 'though':75 'time':427 'tri':28 'uniqu':221 'univers':37,108,225,236 'usual':147 'valu':292 'valuabl':124 've':56 'via':361 'watch':210 'way':20,384,419 'well':1 'whole':82 'without':184 'won':422 'word':274 'work':36,337,359 'world':135 'young':3"
          +ranking: 0
          +commentCount: 0
          +upVotes: 0
          +downVotes: 0
          +visibility: "visible             "
          +apId: "https://discuss.tchncs.de/comment/2687935"
          +editedAt: DateTimeImmutable @1693914611 {#4326
            date: 2023-09-05 13:50:11.0 +02:00
          }
          +createdAt: DateTimeImmutable @1693914344 {#4322
            date: 2023-09-05 13:45:44.0 +02:00
          }
        }
        +root: App\Entity\EntryComment {#4105}
        +body: """
          Haha, I know exactly what you mean – I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot. At work I mostly write Python, but in my own time it’s mostly assembly language. It feels more concrete, every decision matters, and anything that goes wrong is 100% your fault as there are relatively few bugs at that level. It’s a lot of fun. Also the datasheet is very good.\n
          \n
          I’m self-taught with all the electronics stuff, I paid for it by teaching a course on whatever thing I did most recently. Then I’d use the proceeds to buy tools and parts for the next big (often dumb) idea. I’d also ask for the software engineering assignments from colleagues in those programs, and complete them in my spare time. It was puzzling to a few people why I would *want to do assignments*, and indeed some were very boring (oh god Java + Spring framework) but others were quite interesting (formal study of algorithms). Sadly, economic reality kicked in and I had to run a company instead of pursuing my education further (I still try to do one ridiculous engineering thing per year though).\n
          \n
          I guess there’s a real risk (…like 100%) that I overestimate the motivation students have – so I think I’m going to take your advice and set the level of abstraction with something API-like to abstract away the low-level components (this is closer to my client’s domain). I’m imagining a robot that acts as a WiFi access point, and having something “like an API” that works over UDP packets that describe high-level functions. Then start with something simple – like a digital map with known starting location, and a small obstacle course that can be completed with simple distance measurement, no point clouds. If that goes well, I can develop towards more complex material – probably not full SLAM, but maybe localization on a pre-mapped surface. I have plenty of my own code as examples of how to do simple UDP communications in Python, I could expand it into a custom library.\n
          \n
          Sort of like Logo from 1983, but with a physical robot and sensors. I’m a little to young to have used Logo, but the computer lab in my school was really outdated so I got to try it once :D
          """
        +lang: "en"
        +isAdult: false
        +favouriteCount: 0
        +score: 0
        +lastActive: DateTime @1693974973 {#4345
          date: 2023-09-06 06:36:13.0 +02:00
        }
        +ip: null
        +tags: null
        +mentions: [
          "@Saigonauticon@voltage.vn"
          "@rufus@discuss.tchncs.de"
        ]
        +children: Doctrine\ORM\PersistentCollection {#4342 …}
        +nested: Doctrine\ORM\PersistentCollection {#4339 …}
        +votes: Doctrine\ORM\PersistentCollection {#4337 …}
        +reports: Doctrine\ORM\PersistentCollection {#4351 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4353 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4355 …}
        -id: 28109
        -bodyTs: "'100':53,213 '1983':371 'abstract':236,243 'access':268 'act':264 'advic':230 'algorithm':174 'also':71,122 'anyth':48 'api':240,275 'api-lik':239 'ask':123 'assembl':38 'assign':128,154 'attiny10':21 'away':244 'big':116 'bore':160 'bug':61 'buy':109 'client':255 'closer':252 'cloud':315 'code':346 'colleagu':130 'communic':355 'compani':186 'complet':135,308 'complex':325 'compon':249 'comput':391 'concret':43 'constrain':15 'could':359 'cours':94,304 'custom':364 'd':104,121,406 'datasheet':73 'decis':45 'describ':282 'develop':322 'digit':294 'distanc':311 'domain':257 'dumb':118 'econom':176 'educ':191 'electron':85 'embed':16 'engin':127,200 'everi':44 'exact':4 'exampl':348 'expand':360 'fault':55 'feel':41 'formal':171 'framework':165 'full':329 'fun':70 'function':286 'go':226 'god':162 'goe':50,318 'good':76 'got':401 'guess':206 'haha':1 'high':284 'high-level':283 'idea':119 'imagin':260 'inde':156 'instead':187 'interest':11,170 'java':163 'kick':178 'know':3 'known':297 'lab':392 'languag':39 'level':64,234,248,285 'librari':365 'like':19,212,241,273,292,368 'littl':382 'local':333 'locat':299 'logo':369,388 'lot':23,68 'low':247 'low-level':246 'm':9,78,225,259,380 'map':295,338 'materi':326 'matter':46 'mayb':332 'mean':7 'measur':312 'most':27,37 'motiv':218 'next':115 'obstacl':303 'often':117 'oh':161 'one':198 'other':167 'outdat':398 'overestim':216 'packet':280 'paid':88 'part':112 'peopl':147 'per':202 'physic':375 'plenti':342 'point':269,314 'pre':337 'pre-map':336 'probabl':327 'proceed':107 'program':133 'pursu':189 'puzzl':143 'python':29,357 'quit':169 'real':210 'realiti':177 'realli':397 'recent':101 'relat':59 'resourc':14 'resource-constrain':13 'ridicul':199 'risk':211 'robot':262,376 'run':184 'sad':175 'school':395 'self':80 'self-taught':79 'sensor':378 'set':232 'simpl':291,310,353 'slam':330 'small':302 'softwar':126 'someth':238,272,290 'sort':366 'spare':139 'spring':164 'start':288,298 'still':194 'student':219 'studi':172 'stuff':86 'surfac':339 'system':17 'take':228 'taught':81 'teach':92 'thing':97,201 'think':223 'though':204 'time':34,140 'tool':110 'toward':323 'tri':195,403 'udp':279,354 'use':105,387 'want':151 'well':319 'whatev':96 'wifi':267 'work':25,277 'would':150 'write':28 'wrong':51 'year':203 'young':384"
        +ranking: 0
        +commentCount: 0
        +upVotes: 0
        +downVotes: 0
        +visibility: "visible             "
        +apId: "https://voltage.vn/comment/213919"
        +editedAt: null
        +createdAt: DateTimeImmutable @1693974973 {#4348
          date: 2023-09-06 06:36:13.0 +02:00
        }
      }
      +root: App\Entity\EntryComment {#4105}
      +body: """
        Well, there’s also turtles to program in Python (i think) and there is [Scratch](https://en.wikipedia.org/wiki/Scratch_(programming_language)).\n
        \n
        > I guess there’s a real risk (…like 100%) that I overestimate the motivation students have\n
        \n
        Definitely sounds like it. But a motivated teacher is a very good thing. Maybe you’re able to get that spark across to some of the students.\n
        \n
        > API-like to abstract away the low-level components\n
        \n
        You can always have some extra assignments ready, just in case someone is curious and wants to do/know more. A room full of studens will have a mixed amount of knowledge, abilities and motivation anyways.\n
        \n
        > I’m most interested in resource-constrained embedded systems. I like the attiny10 a lot.\n
        \n
        I also ate a few books and datasheets on the Atmel chips in my lifetime. Their design is well-thought-out and probably an excellent subject to learn the concepts about microcontrollers.\n
        \n
        As of now I like the ESP32. It is ridiculously overpowered if you’re used to something like the ATtinies or old ATmegas. With (at least) 520kB of RAM, two cores that work at 240MHz (depending on variant) and very nice peripherals. Also WiFi connectivity is really useful. But it definitely adds to the fun if you programmed the more constrained (previous generation of) microcontrollers and know how spoiled you are and can feel like a supervillain wasting hundreds of kilobytes of memory deliberately. Or (ab)use some of the peripherals for things that wouldn’t be possible with the few timers available on the Atmel chips. Or do trigonometry at crazy frequencies for your robots, because you can handle 32bit floating point numbers. But I’d agree, that doesn’t teach you the same things if you can do floating point arithmetics for cheap and don’t know if calculating a square root is an easy or difficult thing to do. The STM chips also have nice peripherals. But I haven’t really fiddled around with those.\n
        \n
        Definitely hope you’ll have fun being involved in that STEM program.
        """
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693999848 {#4367
        date: 2023-09-06 13:30:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@rufus@discuss.tchncs.de"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4364 …}
      +nested: Doctrine\ORM\PersistentCollection {#4361 …}
      +votes: Doctrine\ORM\PersistentCollection {#4359 …}
      +reports: Doctrine\ORM\PersistentCollection {#4373 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4375 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4377 …}
      -id: 28122
      -bodyTs: "'/wiki/scratch_(programming_language)).':18 '100':27 '240mhz':191 '32bit':277 '520kb':183 'ab':242 'abil':104 'abl':51 'abstract':66 'across':56 'add':208 'agre':284 'also':4,125,199,322 'alway':75 'amount':101 'anyway':107 'api':63 'api-lik':62 'arithmet':299 'around':332 'assign':79 'ate':126 'atmega':179 'atmel':134,262 'attini':176 'attiny10':121 'avail':259 'away':67 'book':129 'calcul':307 'case':83 'cheap':301 'chip':135,263,321 'compon':72 'concept':154 'connect':201 'constrain':115,217 'core':187 'crazi':268 'curious':86 'd':283 'datasheet':131 'definit':35,207,335 'deliber':240 'depend':192 'design':140 'difficult':315 'do/know':90 'doesn':286 'easi':313 'embed':116 'en.wikipedia.org':17 'en.wikipedia.org/wiki/scratch_(programming_language)).':16 'esp32':163 'excel':149 'extra':78 'feel':230 'fiddl':331 'float':278,297 'frequenc':269 'full':94 'fun':211,340 'generat':219 'get':53 'good':46 'guess':20 'handl':276 'haven':328 'hope':336 'hundr':235 'interest':111 'involv':342 'kilobyt':237 'know':223,305 'knowledg':103 'learn':152 'least':182 'level':71 'lifetim':138 'like':26,37,64,119,161,174,231 'll':338 'lot':123 'low':70 'low-level':69 'm':109 'mayb':48 'memori':239 'microcontrol':156,221 'mix':100 'motiv':32,41,106 'nice':197,324 'number':280 'old':178 'overestim':30 'overpow':167 'peripher':198,247,325 'point':279,298 'possibl':254 'previous':218 'probabl':147 'program':7,214,346 'python':9 'ram':185 're':50,170 'readi':80 'real':24 'realli':203,330 'resourc':114 'resource-constrain':113 'ridicul':166 'risk':25 'robot':272 'room':93 'root':310 'scratch':15 'someon':84 'someth':173 'sound':36 'spark':55 'spoil':225 'squar':309 'stem':345 'stm':320 'studen':96 'student':33,61 'subject':150 'supervillain':233 'system':117 'teach':288 'teacher':42 'thing':47,249,292,316 'think':11 'thought':144 'timer':258 'trigonometri':266 'turtl':5 'two':186 'use':171,204,243 'variant':194 'want':88 'wast':234 'well':1,143 'well-thought-out':142 'wifi':200 'work':189 'wouldn':251"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://discuss.tchncs.de/comment/2715856"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693999848 {#4370
        date: 2023-09-06 13:30:48.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4105}
    +body: """
      Good advice all around! Thanks!\n
      \n
      I’ve also messed around with the ESP8266 and various models of ESP32. Their WiFi time-of-flight stuff is *interesting*. I’ve quite a few projects with both actually! My main complaint is that the GPIO don’t behave nicely (also the esp8266 is a power hog and reboots if you screw up the network stack). They are much slower than I’d expect, and have weird states on boot. It’s not too bad to work around this stuff, but I chose the Pi Pico W so as not to have to explain it.\n
      \n
      It still blows me away that I can easily do public-private key encryption on the ESP32. And graphics. At the same time!
      """
    +lang: "en"
    +isAdult: false
    +favouriteCount: 1
    +score: 0
    +lastActive: DateTime @1694071771 {#4389
      date: 2023-09-07 09:29:31.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@rufus@discuss.tchncs.de"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4386 …}
    +nested: Doctrine\ORM\PersistentCollection {#4383 …}
    +votes: Doctrine\ORM\PersistentCollection {#4381 …}
    +reports: Doctrine\ORM\PersistentCollection {#4395 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4397 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4399 …}
    -id: 28234
    -bodyTs: "'actual':36 'advic':2 'also':8,48 'around':4,10,85 'away':107 'bad':82 'behav':46 'blow':105 'boot':77 'chose':90 'complaint':39 'd':70 'easili':111 'encrypt':117 'esp32':18,120 'esp8266':13,50 'expect':71 'explain':101 'flight':24 'good':1 'gpio':43 'graphic':122 'hog':54 'interest':27 'key':116 'main':38 'mess':9 'model':16 'much':66 'network':62 'nice':47 'pi':92 'pico':93 'power':53 'privat':115 'project':33 'public':114 'public-priv':113 'quit':30 'reboot':56 'screw':59 'slower':67 'stack':63 'state':75 'still':104 'stuff':25,87 'thank':5 'time':22,126 'time-of-flight':21 'various':15 've':7,29 'w':94 'weird':74 'wifi':20 'work':84"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/216358"
    +editedAt: null
    +createdAt: DateTimeImmutable @1694071771 {#4392
      date: 2023-09-07 09:29:31.0 +02:00
    }
  }
  +nestedComments: []
  +level: 6
  +view: "tree"
  -entryCommentRepository: App\Repository\EntryCommentRepository {#557 …}
  -twig: Twig\Environment {#1252 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
entry_comment App\Twig\Components\EntryCommentComponent 14.0 MiB 16.63 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4186
    +user: App\Entity\User {#4199
      +avatar: null
      +cover: null
      +email: "Sieguito@lemmy.world"
      +username: "@Sieguito@lemmy.world"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1693561112 {#4183
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
      +entries: Doctrine\ORM\PersistentCollection {#4206 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
      +posts: Doctrine\ORM\PersistentCollection {#4214 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
      +follows: Doctrine\ORM\PersistentCollection {#4226 …}
      +followers: Doctrine\ORM\PersistentCollection {#4228 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
      +reports: Doctrine\ORM\PersistentCollection {#4238 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
      +violations: Doctrine\ORM\PersistentCollection {#4242 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
      +awards: Doctrine\ORM\PersistentCollection {#4246 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
      +categories: Doctrine\ORM\PersistentCollection {#4250 …}
      -id: 29634
      -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
      +apId: "Sieguito@lemmy.world"
      +apProfileId: "https://lemmy.world/u/Sieguito"
      +apPublicUrl: "https://lemmy.world/u/Sieguito"
      +apFollowersUrl: null
      +apInboxUrl: "https://lemmy.world/inbox"
      +apDomain: "lemmy.world"
      +apPreferredUsername: "Sieguito"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1693561112 {#4184
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689503171 {#4185
        date: 2023-07-16 12:26:11.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906728 {#4181
      date: 2023-09-05 11:38:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4187 …}
    +nested: Doctrine\ORM\PersistentCollection {#4189 …}
    +votes: Doctrine\ORM\PersistentCollection {#4191 …}
    +reports: Doctrine\ORM\PersistentCollection {#4193 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
    -id: 27587
    -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://lemmy.world/comment/3015237"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693561111 {#4182
      date: 2023-09-01 11:38:31.0 +02:00
    }
  }
  "showNested" => true
  "dateAsUrl" => false
  "showMagazineName" => false
  "showEntryTitle" => false
]
Attributes
[]
Component
App\Twig\Components\EntryCommentComponent {#9475
  +comment: App\Entity\EntryComment {#4186
    +user: App\Entity\User {#4199
      +avatar: null
      +cover: null
      +email: "Sieguito@lemmy.world"
      +username: "@Sieguito@lemmy.world"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1693561112 {#4183
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
      +entries: Doctrine\ORM\PersistentCollection {#4206 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
      +posts: Doctrine\ORM\PersistentCollection {#4214 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
      +follows: Doctrine\ORM\PersistentCollection {#4226 …}
      +followers: Doctrine\ORM\PersistentCollection {#4228 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
      +reports: Doctrine\ORM\PersistentCollection {#4238 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
      +violations: Doctrine\ORM\PersistentCollection {#4242 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
      +awards: Doctrine\ORM\PersistentCollection {#4246 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
      +categories: Doctrine\ORM\PersistentCollection {#4250 …}
      -id: 29634
      -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
      +apId: "Sieguito@lemmy.world"
      +apProfileId: "https://lemmy.world/u/Sieguito"
      +apPublicUrl: "https://lemmy.world/u/Sieguito"
      +apFollowersUrl: null
      +apInboxUrl: "https://lemmy.world/inbox"
      +apDomain: "lemmy.world"
      +apPreferredUsername: "Sieguito"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1693561112 {#4184
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689503171 {#4185
        date: 2023-07-16 12:26:11.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906728 {#4181
      date: 2023-09-05 11:38:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4187 …}
    +nested: Doctrine\ORM\PersistentCollection {#4189 …}
    +votes: Doctrine\ORM\PersistentCollection {#4191 …}
    +reports: Doctrine\ORM\PersistentCollection {#4193 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
    -id: 27587
    -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://lemmy.world/comment/3015237"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693561111 {#4182
      date: 2023-09-01 11:38:31.0 +02:00
    }
  }
  +showMagazineName: false
  +showEntryTitle: false
  +showNested: true
  +level: 1
  +canSeeTrash: false
  +dateAsUrl: false
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -authorizationChecker: Symfony\Component\Security\Core\Authorization\AuthorizationChecker {#931 …}
}
user_inline App\Twig\Components\UserInlineComponent 14.0 MiB 0.13 ms
Input props
[
  "user" => App\Entity\User {#4199
    +avatar: null
    +cover: null
    +email: "Sieguito@lemmy.world"
    +username: "@Sieguito@lemmy.world"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1693561112 {#4183
      date: 2023-09-01 11:38:32.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
    +entries: Doctrine\ORM\PersistentCollection {#4206 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
    +posts: Doctrine\ORM\PersistentCollection {#4214 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
    +follows: Doctrine\ORM\PersistentCollection {#4226 …}
    +followers: Doctrine\ORM\PersistentCollection {#4228 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
    +reports: Doctrine\ORM\PersistentCollection {#4238 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
    +violations: Doctrine\ORM\PersistentCollection {#4242 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
    +awards: Doctrine\ORM\PersistentCollection {#4246 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
    +categories: Doctrine\ORM\PersistentCollection {#4250 …}
    -id: 29634
    -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
    +apId: "Sieguito@lemmy.world"
    +apProfileId: "https://lemmy.world/u/Sieguito"
    +apPublicUrl: "https://lemmy.world/u/Sieguito"
    +apFollowersUrl: null
    +apInboxUrl: "https://lemmy.world/inbox"
    +apDomain: "lemmy.world"
    +apPreferredUsername: "Sieguito"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1693561112 {#4184
      date: 2023-09-01 11:38:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689503171 {#4185
      date: 2023-07-16 12:26:11.0 +02:00
    }
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#9520
  +user: App\Entity\User {#4199
    +avatar: null
    +cover: null
    +email: "Sieguito@lemmy.world"
    +username: "@Sieguito@lemmy.world"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1693561112 {#4183
      date: 2023-09-01 11:38:32.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
    +entries: Doctrine\ORM\PersistentCollection {#4206 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
    +posts: Doctrine\ORM\PersistentCollection {#4214 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
    +follows: Doctrine\ORM\PersistentCollection {#4226 …}
    +followers: Doctrine\ORM\PersistentCollection {#4228 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
    +reports: Doctrine\ORM\PersistentCollection {#4238 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
    +violations: Doctrine\ORM\PersistentCollection {#4242 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
    +awards: Doctrine\ORM\PersistentCollection {#4246 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
    +categories: Doctrine\ORM\PersistentCollection {#4250 …}
    -id: 29634
    -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
    +apId: "Sieguito@lemmy.world"
    +apProfileId: "https://lemmy.world/u/Sieguito"
    +apPublicUrl: "https://lemmy.world/u/Sieguito"
    +apFollowersUrl: null
    +apInboxUrl: "https://lemmy.world/inbox"
    +apDomain: "lemmy.world"
    +apPreferredUsername: "Sieguito"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1693561112 {#4184
      date: 2023-09-01 11:38:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689503171 {#4185
      date: 2023-07-16 12:26:11.0 +02:00
    }
  }
  +showAvatar: false
}
date App\Twig\Components\DateComponent 14.0 MiB 0.13 ms
Input props
[
  "date" => DateTimeImmutable @1693561111 {#4182
    date: 2023-09-01 11:38:31.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#9575
  +date: DateTimeImmutable @1693561111 {#4182
    date: 2023-09-01 11:38:31.0 +02:00
  }
}
date_edited App\Twig\Components\DateEditedComponent 14.0 MiB 0.09 ms
Input props
[
  "createdAt" => DateTimeImmutable @1693561111 {#4182
    date: 2023-09-01 11:38:31.0 +02:00
  }
  "editedAt" => null
]
Attributes
[]
Component
App\Twig\Components\DateEditedComponent {#9629
  +createdAt: DateTimeImmutable @1693561111 {#4182
    date: 2023-09-01 11:38:31.0 +02:00
  }
  +editedAt: null
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 0.13 ms
Input props
[
  "user" => App\Entity\User {#4199
    +avatar: null
    +cover: null
    +email: "Sieguito@lemmy.world"
    +username: "@Sieguito@lemmy.world"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1693561112 {#4183
      date: 2023-09-01 11:38:32.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
    +entries: Doctrine\ORM\PersistentCollection {#4206 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
    +posts: Doctrine\ORM\PersistentCollection {#4214 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
    +follows: Doctrine\ORM\PersistentCollection {#4226 …}
    +followers: Doctrine\ORM\PersistentCollection {#4228 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
    +reports: Doctrine\ORM\PersistentCollection {#4238 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
    +violations: Doctrine\ORM\PersistentCollection {#4242 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
    +awards: Doctrine\ORM\PersistentCollection {#4246 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
    +categories: Doctrine\ORM\PersistentCollection {#4250 …}
    -id: 29634
    -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
    +apId: "Sieguito@lemmy.world"
    +apProfileId: "https://lemmy.world/u/Sieguito"
    +apPublicUrl: "https://lemmy.world/u/Sieguito"
    +apFollowersUrl: null
    +apInboxUrl: "https://lemmy.world/inbox"
    +apDomain: "lemmy.world"
    +apPreferredUsername: "Sieguito"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1693561112 {#4184
      date: 2023-09-01 11:38:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689503171 {#4185
      date: 2023-07-16 12:26:11.0 +02:00
    }
  }
  "width" => 40
  "height" => 40
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#9683
  +width: 40
  +height: 40
  +user: App\Entity\User {#4199
    +avatar: null
    +cover: null
    +email: "Sieguito@lemmy.world"
    +username: "@Sieguito@lemmy.world"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1693561112 {#4183
      date: 2023-09-01 11:38:32.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
    +entries: Doctrine\ORM\PersistentCollection {#4206 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
    +posts: Doctrine\ORM\PersistentCollection {#4214 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
    +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
    +follows: Doctrine\ORM\PersistentCollection {#4226 …}
    +followers: Doctrine\ORM\PersistentCollection {#4228 …}
    +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
    +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
    +reports: Doctrine\ORM\PersistentCollection {#4238 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
    +violations: Doctrine\ORM\PersistentCollection {#4242 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
    +awards: Doctrine\ORM\PersistentCollection {#4246 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
    +categories: Doctrine\ORM\PersistentCollection {#4250 …}
    -id: 29634
    -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
    +apId: "Sieguito@lemmy.world"
    +apProfileId: "https://lemmy.world/u/Sieguito"
    +apPublicUrl: "https://lemmy.world/u/Sieguito"
    +apFollowersUrl: null
    +apInboxUrl: "https://lemmy.world/inbox"
    +apDomain: "lemmy.world"
    +apPreferredUsername: "Sieguito"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1693561112 {#4184
      date: 2023-09-01 11:38:32.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689503171 {#4185
      date: 2023-07-16 12:26:11.0 +02:00
    }
  }
  +asLink: true
}
vote App\Twig\Components\VoteComponent 14.0 MiB 0.55 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4186
    +user: App\Entity\User {#4199
      +avatar: null
      +cover: null
      +email: "Sieguito@lemmy.world"
      +username: "@Sieguito@lemmy.world"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1693561112 {#4183
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
      +entries: Doctrine\ORM\PersistentCollection {#4206 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
      +posts: Doctrine\ORM\PersistentCollection {#4214 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
      +follows: Doctrine\ORM\PersistentCollection {#4226 …}
      +followers: Doctrine\ORM\PersistentCollection {#4228 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
      +reports: Doctrine\ORM\PersistentCollection {#4238 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
      +violations: Doctrine\ORM\PersistentCollection {#4242 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
      +awards: Doctrine\ORM\PersistentCollection {#4246 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
      +categories: Doctrine\ORM\PersistentCollection {#4250 …}
      -id: 29634
      -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
      +apId: "Sieguito@lemmy.world"
      +apProfileId: "https://lemmy.world/u/Sieguito"
      +apPublicUrl: "https://lemmy.world/u/Sieguito"
      +apFollowersUrl: null
      +apInboxUrl: "https://lemmy.world/inbox"
      +apDomain: "lemmy.world"
      +apPreferredUsername: "Sieguito"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1693561112 {#4184
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689503171 {#4185
        date: 2023-07-16 12:26:11.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906728 {#4181
      date: 2023-09-05 11:38:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4187 …}
    +nested: Doctrine\ORM\PersistentCollection {#4189 …}
    +votes: Doctrine\ORM\PersistentCollection {#4191 …}
    +reports: Doctrine\ORM\PersistentCollection {#4193 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
    -id: 27587
    -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://lemmy.world/comment/3015237"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693561111 {#4182
      date: 2023-09-01 11:38:31.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\VoteComponent {#9752
  +subject: App\Entity\EntryComment {#4186
    +user: App\Entity\User {#4199
      +avatar: null
      +cover: null
      +email: "Sieguito@lemmy.world"
      +username: "@Sieguito@lemmy.world"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1693561112 {#4183
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
      +entries: Doctrine\ORM\PersistentCollection {#4206 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
      +posts: Doctrine\ORM\PersistentCollection {#4214 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
      +follows: Doctrine\ORM\PersistentCollection {#4226 …}
      +followers: Doctrine\ORM\PersistentCollection {#4228 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
      +reports: Doctrine\ORM\PersistentCollection {#4238 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
      +violations: Doctrine\ORM\PersistentCollection {#4242 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
      +awards: Doctrine\ORM\PersistentCollection {#4246 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
      +categories: Doctrine\ORM\PersistentCollection {#4250 …}
      -id: 29634
      -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
      +apId: "Sieguito@lemmy.world"
      +apProfileId: "https://lemmy.world/u/Sieguito"
      +apPublicUrl: "https://lemmy.world/u/Sieguito"
      +apFollowersUrl: null
      +apInboxUrl: "https://lemmy.world/inbox"
      +apDomain: "lemmy.world"
      +apPreferredUsername: "Sieguito"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1693561112 {#4184
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689503171 {#4185
        date: 2023-07-16 12:26:11.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906728 {#4181
      date: 2023-09-05 11:38:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4187 …}
    +nested: Doctrine\ORM\PersistentCollection {#4189 …}
    +votes: Doctrine\ORM\PersistentCollection {#4191 …}
    +reports: Doctrine\ORM\PersistentCollection {#4193 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
    -id: 27587
    -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://lemmy.world/comment/3015237"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693561111 {#4182
      date: 2023-09-01 11:38:31.0 +02:00
    }
  }
  +formDest: "entry_comment"
  +showDownvote: true
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
boost App\Twig\Components\BoostComponent 14.0 MiB 0.63 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4186
    +user: App\Entity\User {#4199
      +avatar: null
      +cover: null
      +email: "Sieguito@lemmy.world"
      +username: "@Sieguito@lemmy.world"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1693561112 {#4183
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
      +entries: Doctrine\ORM\PersistentCollection {#4206 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
      +posts: Doctrine\ORM\PersistentCollection {#4214 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
      +follows: Doctrine\ORM\PersistentCollection {#4226 …}
      +followers: Doctrine\ORM\PersistentCollection {#4228 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
      +reports: Doctrine\ORM\PersistentCollection {#4238 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
      +violations: Doctrine\ORM\PersistentCollection {#4242 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
      +awards: Doctrine\ORM\PersistentCollection {#4246 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
      +categories: Doctrine\ORM\PersistentCollection {#4250 …}
      -id: 29634
      -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
      +apId: "Sieguito@lemmy.world"
      +apProfileId: "https://lemmy.world/u/Sieguito"
      +apPublicUrl: "https://lemmy.world/u/Sieguito"
      +apFollowersUrl: null
      +apInboxUrl: "https://lemmy.world/inbox"
      +apDomain: "lemmy.world"
      +apPreferredUsername: "Sieguito"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1693561112 {#4184
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689503171 {#4185
        date: 2023-07-16 12:26:11.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906728 {#4181
      date: 2023-09-05 11:38:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4187 …}
    +nested: Doctrine\ORM\PersistentCollection {#4189 …}
    +votes: Doctrine\ORM\PersistentCollection {#4191 …}
    +reports: Doctrine\ORM\PersistentCollection {#4193 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
    -id: 27587
    -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://lemmy.world/comment/3015237"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693561111 {#4182
      date: 2023-09-01 11:38:31.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\BoostComponent {#9809
  +formDest: "entry_comment"
  +subject: App\Entity\EntryComment {#4186
    +user: App\Entity\User {#4199
      +avatar: null
      +cover: null
      +email: "Sieguito@lemmy.world"
      +username: "@Sieguito@lemmy.world"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1693561112 {#4183
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
      +entries: Doctrine\ORM\PersistentCollection {#4206 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
      +posts: Doctrine\ORM\PersistentCollection {#4214 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
      +follows: Doctrine\ORM\PersistentCollection {#4226 …}
      +followers: Doctrine\ORM\PersistentCollection {#4228 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
      +reports: Doctrine\ORM\PersistentCollection {#4238 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
      +violations: Doctrine\ORM\PersistentCollection {#4242 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
      +awards: Doctrine\ORM\PersistentCollection {#4246 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
      +categories: Doctrine\ORM\PersistentCollection {#4250 …}
      -id: 29634
      -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
      +apId: "Sieguito@lemmy.world"
      +apProfileId: "https://lemmy.world/u/Sieguito"
      +apPublicUrl: "https://lemmy.world/u/Sieguito"
      +apFollowersUrl: null
      +apInboxUrl: "https://lemmy.world/inbox"
      +apDomain: "lemmy.world"
      +apPreferredUsername: "Sieguito"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1693561112 {#4184
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689503171 {#4185
        date: 2023-07-16 12:26:11.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906728 {#4181
      date: 2023-09-05 11:38:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4187 …}
    +nested: Doctrine\ORM\PersistentCollection {#4189 …}
    +votes: Doctrine\ORM\PersistentCollection {#4191 …}
    +reports: Doctrine\ORM\PersistentCollection {#4193 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
    -id: 27587
    -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://lemmy.world/comment/3015237"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693561111 {#4182
      date: 2023-09-01 11:38:31.0 +02:00
    }
  }
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
entry_comments_nested App\Twig\Components\EntryCommentsNestedComponent 14.0 MiB 10.18 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4186
    +user: App\Entity\User {#4199
      +avatar: null
      +cover: null
      +email: "Sieguito@lemmy.world"
      +username: "@Sieguito@lemmy.world"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1693561112 {#4183
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
      +entries: Doctrine\ORM\PersistentCollection {#4206 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
      +posts: Doctrine\ORM\PersistentCollection {#4214 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
      +follows: Doctrine\ORM\PersistentCollection {#4226 …}
      +followers: Doctrine\ORM\PersistentCollection {#4228 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
      +reports: Doctrine\ORM\PersistentCollection {#4238 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
      +violations: Doctrine\ORM\PersistentCollection {#4242 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
      +awards: Doctrine\ORM\PersistentCollection {#4246 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
      +categories: Doctrine\ORM\PersistentCollection {#4250 …}
      -id: 29634
      -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
      +apId: "Sieguito@lemmy.world"
      +apProfileId: "https://lemmy.world/u/Sieguito"
      +apPublicUrl: "https://lemmy.world/u/Sieguito"
      +apFollowersUrl: null
      +apInboxUrl: "https://lemmy.world/inbox"
      +apDomain: "lemmy.world"
      +apPreferredUsername: "Sieguito"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1693561112 {#4184
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689503171 {#4185
        date: 2023-07-16 12:26:11.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906728 {#4181
      date: 2023-09-05 11:38:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4187 …}
    +nested: Doctrine\ORM\PersistentCollection {#4189 …}
    +votes: Doctrine\ORM\PersistentCollection {#4191 …}
    +reports: Doctrine\ORM\PersistentCollection {#4193 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
    -id: 27587
    -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://lemmy.world/comment/3015237"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693561111 {#4182
      date: 2023-09-01 11:38:31.0 +02:00
    }
  }
  "level" => 1
  "showNested" => true
  "view" => "tree"
]
Attributes
[
  "showNested" => true
]
Component
App\Twig\Components\EntryCommentsNestedComponent {#10049
  +comment: App\Entity\EntryComment {#4186
    +user: App\Entity\User {#4199
      +avatar: null
      +cover: null
      +email: "Sieguito@lemmy.world"
      +username: "@Sieguito@lemmy.world"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1693561112 {#4183
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
      +entries: Doctrine\ORM\PersistentCollection {#4206 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
      +posts: Doctrine\ORM\PersistentCollection {#4214 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
      +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
      +follows: Doctrine\ORM\PersistentCollection {#4226 …}
      +followers: Doctrine\ORM\PersistentCollection {#4228 …}
      +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
      +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
      +reports: Doctrine\ORM\PersistentCollection {#4238 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
      +violations: Doctrine\ORM\PersistentCollection {#4242 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
      +awards: Doctrine\ORM\PersistentCollection {#4246 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
      +categories: Doctrine\ORM\PersistentCollection {#4250 …}
      -id: 29634
      -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
      +apId: "Sieguito@lemmy.world"
      +apProfileId: "https://lemmy.world/u/Sieguito"
      +apPublicUrl: "https://lemmy.world/u/Sieguito"
      +apFollowersUrl: null
      +apInboxUrl: "https://lemmy.world/inbox"
      +apDomain: "lemmy.world"
      +apPreferredUsername: "Sieguito"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1693561112 {#4184
        date: 2023-09-01 11:38:32.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689503171 {#4185
        date: 2023-07-16 12:26:11.0 +02:00
      }
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961
        +avatar: null
        +cover: null
        +email: "Saigonauticon@voltage.vn"
        +username: "@Saigonauticon@voltage.vn"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1703981706 {#1519
          date: 2023-12-31 01:15:06.0 +01:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
        +entries: Doctrine\ORM\PersistentCollection {#1712 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
        +posts: Doctrine\ORM\PersistentCollection {#1753 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
        +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
        +follows: Doctrine\ORM\PersistentCollection {#1421 …}
        +followers: Doctrine\ORM\PersistentCollection {#1635 …}
        +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
        +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
        +reports: Doctrine\ORM\PersistentCollection {#1454 …}
        +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
        +violations: Doctrine\ORM\PersistentCollection {#1693 …}
        +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
        +awards: Doctrine\ORM\PersistentCollection {#1438 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
        +categories: Doctrine\ORM\PersistentCollection {#1665 …}
        -id: 269
        -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
        +apId: "Saigonauticon@voltage.vn"
        +apProfileId: "https://voltage.vn/u/Saigonauticon"
        +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
        +apFollowersUrl: null
        +apInboxUrl: "https://voltage.vn/inbox"
        +apDomain: "voltage.vn"
        +apPreferredUsername: "Saigonauticon"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1709584336 {#1520
          date: 2024-03-04 21:32:16.0 +01:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1686890246 {#1517
          date: 2023-06-16 06:37:26.0 +02:00
        }
        +__isInitialized__: true
         …2
      }
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: null
    +root: null
    +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906728 {#4181
      date: 2023-09-05 11:38:48.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4187 …}
    +nested: Doctrine\ORM\PersistentCollection {#4189 …}
    +votes: Doctrine\ORM\PersistentCollection {#4191 …}
    +reports: Doctrine\ORM\PersistentCollection {#4193 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
    -id: 27587
    -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://lemmy.world/comment/3015237"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693561111 {#4182
      date: 2023-09-01 11:38:31.0 +02:00
    }
  }
  +nestedComments: [
    28064 => App\Entity\EntryComment {#4270
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: App\Entity\EntryComment {#4186}
      +root: App\Entity\EntryComment {#4186}
      +body: "Yup. Agree. Probably going to go with a LiDAR-first approach."
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906726 {#4271
        date: 2023-09-05 11:38:46.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
        "@Sieguito@lemmy.world"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4267 …}
      +nested: Doctrine\ORM\PersistentCollection {#4263 …}
      +votes: Doctrine\ORM\PersistentCollection {#4261 …}
      +reports: Doctrine\ORM\PersistentCollection {#4276 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4278 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4280 …}
      -id: 28064
      -bodyTs: "'agre':2 'approach':12 'first':11 'go':4,6 'lidar':10 'lidar-first':9 'probabl':3 'yup':1"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://voltage.vn/comment/212524"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693906726 {#4274
        date: 2023-09-05 11:38:46.0 +02:00
      }
    }
  ]
  +level: 1
  +view: "tree"
  -entryCommentRepository: App\Repository\EntryCommentRepository {#557 …}
  -twig: Twig\Environment {#1252 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
entry_comment App\Twig\Components\EntryCommentComponent 14.0 MiB 6.24 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4270
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4186
      +user: App\Entity\User {#4199
        +avatar: null
        +cover: null
        +email: "Sieguito@lemmy.world"
        +username: "@Sieguito@lemmy.world"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1693561112 {#4183
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
        +entries: Doctrine\ORM\PersistentCollection {#4206 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
        +posts: Doctrine\ORM\PersistentCollection {#4214 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
        +follows: Doctrine\ORM\PersistentCollection {#4226 …}
        +followers: Doctrine\ORM\PersistentCollection {#4228 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
        +reports: Doctrine\ORM\PersistentCollection {#4238 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
        +violations: Doctrine\ORM\PersistentCollection {#4242 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
        +awards: Doctrine\ORM\PersistentCollection {#4246 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
        +categories: Doctrine\ORM\PersistentCollection {#4250 …}
        -id: 29634
        -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
        +apId: "Sieguito@lemmy.world"
        +apProfileId: "https://lemmy.world/u/Sieguito"
        +apPublicUrl: "https://lemmy.world/u/Sieguito"
        +apFollowersUrl: null
        +apInboxUrl: "https://lemmy.world/inbox"
        +apDomain: "lemmy.world"
        +apPreferredUsername: "Sieguito"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1693561112 {#4184
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689503171 {#4185
          date: 2023-07-16 12:26:11.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906728 {#4181
        date: 2023-09-05 11:38:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4187 …}
      +nested: Doctrine\ORM\PersistentCollection {#4189 …}
      +votes: Doctrine\ORM\PersistentCollection {#4191 …}
      +reports: Doctrine\ORM\PersistentCollection {#4193 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
      -id: 27587
      -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://lemmy.world/comment/3015237"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693561111 {#4182
        date: 2023-09-01 11:38:31.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4186}
    +body: "Yup. Agree. Probably going to go with a LiDAR-first approach."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906726 {#4271
      date: 2023-09-05 11:38:46.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@Sieguito@lemmy.world"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4267 …}
    +nested: Doctrine\ORM\PersistentCollection {#4263 …}
    +votes: Doctrine\ORM\PersistentCollection {#4261 …}
    +reports: Doctrine\ORM\PersistentCollection {#4276 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4278 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4280 …}
    -id: 28064
    -bodyTs: "'agre':2 'approach':12 'first':11 'go':4,6 'lidar':10 'lidar-first':9 'probabl':3 'yup':1"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212524"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906726 {#4274
      date: 2023-09-05 11:38:46.0 +02:00
    }
  }
  "showNested" => true
  "level" => 2
  "showEntryTitle" => false
  "showMagazineName" => false
]
Attributes
[]
Component
App\Twig\Components\EntryCommentComponent {#10109
  +comment: App\Entity\EntryComment {#4270
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4186
      +user: App\Entity\User {#4199
        +avatar: null
        +cover: null
        +email: "Sieguito@lemmy.world"
        +username: "@Sieguito@lemmy.world"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1693561112 {#4183
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
        +entries: Doctrine\ORM\PersistentCollection {#4206 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
        +posts: Doctrine\ORM\PersistentCollection {#4214 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
        +follows: Doctrine\ORM\PersistentCollection {#4226 …}
        +followers: Doctrine\ORM\PersistentCollection {#4228 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
        +reports: Doctrine\ORM\PersistentCollection {#4238 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
        +violations: Doctrine\ORM\PersistentCollection {#4242 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
        +awards: Doctrine\ORM\PersistentCollection {#4246 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
        +categories: Doctrine\ORM\PersistentCollection {#4250 …}
        -id: 29634
        -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
        +apId: "Sieguito@lemmy.world"
        +apProfileId: "https://lemmy.world/u/Sieguito"
        +apPublicUrl: "https://lemmy.world/u/Sieguito"
        +apFollowersUrl: null
        +apInboxUrl: "https://lemmy.world/inbox"
        +apDomain: "lemmy.world"
        +apPreferredUsername: "Sieguito"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1693561112 {#4184
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689503171 {#4185
          date: 2023-07-16 12:26:11.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906728 {#4181
        date: 2023-09-05 11:38:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4187 …}
      +nested: Doctrine\ORM\PersistentCollection {#4189 …}
      +votes: Doctrine\ORM\PersistentCollection {#4191 …}
      +reports: Doctrine\ORM\PersistentCollection {#4193 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
      -id: 27587
      -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://lemmy.world/comment/3015237"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693561111 {#4182
        date: 2023-09-01 11:38:31.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4186}
    +body: "Yup. Agree. Probably going to go with a LiDAR-first approach."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906726 {#4271
      date: 2023-09-05 11:38:46.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@Sieguito@lemmy.world"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4267 …}
    +nested: Doctrine\ORM\PersistentCollection {#4263 …}
    +votes: Doctrine\ORM\PersistentCollection {#4261 …}
    +reports: Doctrine\ORM\PersistentCollection {#4276 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4278 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4280 …}
    -id: 28064
    -bodyTs: "'agre':2 'approach':12 'first':11 'go':4,6 'lidar':10 'lidar-first':9 'probabl':3 'yup':1"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212524"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906726 {#4274
      date: 2023-09-05 11:38:46.0 +02:00
    }
  }
  +showMagazineName: false
  +showEntryTitle: false
  +showNested: true
  +level: 2
  +canSeeTrash: false
  +dateAsUrl: false
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -authorizationChecker: Symfony\Component\Security\Core\Authorization\AuthorizationChecker {#931 …}
}
user_inline App\Twig\Components\UserInlineComponent 14.0 MiB 0.14 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#10154
  +user: Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +showAvatar: false
}
date App\Twig\Components\DateComponent 14.0 MiB 0.23 ms
Input props
[
  "date" => DateTimeImmutable @1693906726 {#4274
    date: 2023-09-05 11:38:46.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#10209
  +date: DateTimeImmutable @1693906726 {#4274
    date: 2023-09-05 11:38:46.0 +02:00
  }
}
date_edited App\Twig\Components\DateEditedComponent 14.0 MiB 0.09 ms
Input props
[
  "createdAt" => DateTimeImmutable @1693906726 {#4274
    date: 2023-09-05 11:38:46.0 +02:00
  }
  "editedAt" => null
]
Attributes
[]
Component
App\Twig\Components\DateEditedComponent {#10263
  +createdAt: DateTimeImmutable @1693906726 {#4274
    date: 2023-09-05 11:38:46.0 +02:00
  }
  +editedAt: null
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 0.16 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  "width" => 40
  "height" => 40
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#10317
  +width: 40
  +height: 40
  +user: Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +asLink: true
}
vote App\Twig\Components\VoteComponent 14.0 MiB 0.58 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4270
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4186
      +user: App\Entity\User {#4199
        +avatar: null
        +cover: null
        +email: "Sieguito@lemmy.world"
        +username: "@Sieguito@lemmy.world"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1693561112 {#4183
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
        +entries: Doctrine\ORM\PersistentCollection {#4206 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
        +posts: Doctrine\ORM\PersistentCollection {#4214 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
        +follows: Doctrine\ORM\PersistentCollection {#4226 …}
        +followers: Doctrine\ORM\PersistentCollection {#4228 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
        +reports: Doctrine\ORM\PersistentCollection {#4238 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
        +violations: Doctrine\ORM\PersistentCollection {#4242 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
        +awards: Doctrine\ORM\PersistentCollection {#4246 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
        +categories: Doctrine\ORM\PersistentCollection {#4250 …}
        -id: 29634
        -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
        +apId: "Sieguito@lemmy.world"
        +apProfileId: "https://lemmy.world/u/Sieguito"
        +apPublicUrl: "https://lemmy.world/u/Sieguito"
        +apFollowersUrl: null
        +apInboxUrl: "https://lemmy.world/inbox"
        +apDomain: "lemmy.world"
        +apPreferredUsername: "Sieguito"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1693561112 {#4184
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689503171 {#4185
          date: 2023-07-16 12:26:11.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906728 {#4181
        date: 2023-09-05 11:38:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4187 …}
      +nested: Doctrine\ORM\PersistentCollection {#4189 …}
      +votes: Doctrine\ORM\PersistentCollection {#4191 …}
      +reports: Doctrine\ORM\PersistentCollection {#4193 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
      -id: 27587
      -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://lemmy.world/comment/3015237"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693561111 {#4182
        date: 2023-09-01 11:38:31.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4186}
    +body: "Yup. Agree. Probably going to go with a LiDAR-first approach."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906726 {#4271
      date: 2023-09-05 11:38:46.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@Sieguito@lemmy.world"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4267 …}
    +nested: Doctrine\ORM\PersistentCollection {#4263 …}
    +votes: Doctrine\ORM\PersistentCollection {#4261 …}
    +reports: Doctrine\ORM\PersistentCollection {#4276 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4278 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4280 …}
    -id: 28064
    -bodyTs: "'agre':2 'approach':12 'first':11 'go':4,6 'lidar':10 'lidar-first':9 'probabl':3 'yup':1"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212524"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906726 {#4274
      date: 2023-09-05 11:38:46.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\VoteComponent {#10386
  +subject: App\Entity\EntryComment {#4270
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4186
      +user: App\Entity\User {#4199
        +avatar: null
        +cover: null
        +email: "Sieguito@lemmy.world"
        +username: "@Sieguito@lemmy.world"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1693561112 {#4183
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
        +entries: Doctrine\ORM\PersistentCollection {#4206 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
        +posts: Doctrine\ORM\PersistentCollection {#4214 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
        +follows: Doctrine\ORM\PersistentCollection {#4226 …}
        +followers: Doctrine\ORM\PersistentCollection {#4228 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
        +reports: Doctrine\ORM\PersistentCollection {#4238 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
        +violations: Doctrine\ORM\PersistentCollection {#4242 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
        +awards: Doctrine\ORM\PersistentCollection {#4246 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
        +categories: Doctrine\ORM\PersistentCollection {#4250 …}
        -id: 29634
        -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
        +apId: "Sieguito@lemmy.world"
        +apProfileId: "https://lemmy.world/u/Sieguito"
        +apPublicUrl: "https://lemmy.world/u/Sieguito"
        +apFollowersUrl: null
        +apInboxUrl: "https://lemmy.world/inbox"
        +apDomain: "lemmy.world"
        +apPreferredUsername: "Sieguito"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1693561112 {#4184
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689503171 {#4185
          date: 2023-07-16 12:26:11.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906728 {#4181
        date: 2023-09-05 11:38:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4187 …}
      +nested: Doctrine\ORM\PersistentCollection {#4189 …}
      +votes: Doctrine\ORM\PersistentCollection {#4191 …}
      +reports: Doctrine\ORM\PersistentCollection {#4193 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
      -id: 27587
      -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://lemmy.world/comment/3015237"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693561111 {#4182
        date: 2023-09-01 11:38:31.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4186}
    +body: "Yup. Agree. Probably going to go with a LiDAR-first approach."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906726 {#4271
      date: 2023-09-05 11:38:46.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@Sieguito@lemmy.world"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4267 …}
    +nested: Doctrine\ORM\PersistentCollection {#4263 …}
    +votes: Doctrine\ORM\PersistentCollection {#4261 …}
    +reports: Doctrine\ORM\PersistentCollection {#4276 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4278 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4280 …}
    -id: 28064
    -bodyTs: "'agre':2 'approach':12 'first':11 'go':4,6 'lidar':10 'lidar-first':9 'probabl':3 'yup':1"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212524"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906726 {#4274
      date: 2023-09-05 11:38:46.0 +02:00
    }
  }
  +formDest: "entry_comment"
  +showDownvote: true
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
boost App\Twig\Components\BoostComponent 14.0 MiB 0.76 ms
Input props
[
  "subject" => App\Entity\EntryComment {#4270
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4186
      +user: App\Entity\User {#4199
        +avatar: null
        +cover: null
        +email: "Sieguito@lemmy.world"
        +username: "@Sieguito@lemmy.world"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1693561112 {#4183
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
        +entries: Doctrine\ORM\PersistentCollection {#4206 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
        +posts: Doctrine\ORM\PersistentCollection {#4214 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
        +follows: Doctrine\ORM\PersistentCollection {#4226 …}
        +followers: Doctrine\ORM\PersistentCollection {#4228 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
        +reports: Doctrine\ORM\PersistentCollection {#4238 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
        +violations: Doctrine\ORM\PersistentCollection {#4242 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
        +awards: Doctrine\ORM\PersistentCollection {#4246 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
        +categories: Doctrine\ORM\PersistentCollection {#4250 …}
        -id: 29634
        -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
        +apId: "Sieguito@lemmy.world"
        +apProfileId: "https://lemmy.world/u/Sieguito"
        +apPublicUrl: "https://lemmy.world/u/Sieguito"
        +apFollowersUrl: null
        +apInboxUrl: "https://lemmy.world/inbox"
        +apDomain: "lemmy.world"
        +apPreferredUsername: "Sieguito"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1693561112 {#4184
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689503171 {#4185
          date: 2023-07-16 12:26:11.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906728 {#4181
        date: 2023-09-05 11:38:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4187 …}
      +nested: Doctrine\ORM\PersistentCollection {#4189 …}
      +votes: Doctrine\ORM\PersistentCollection {#4191 …}
      +reports: Doctrine\ORM\PersistentCollection {#4193 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
      -id: 27587
      -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://lemmy.world/comment/3015237"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693561111 {#4182
        date: 2023-09-01 11:38:31.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4186}
    +body: "Yup. Agree. Probably going to go with a LiDAR-first approach."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906726 {#4271
      date: 2023-09-05 11:38:46.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@Sieguito@lemmy.world"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4267 …}
    +nested: Doctrine\ORM\PersistentCollection {#4263 …}
    +votes: Doctrine\ORM\PersistentCollection {#4261 …}
    +reports: Doctrine\ORM\PersistentCollection {#4276 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4278 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4280 …}
    -id: 28064
    -bodyTs: "'agre':2 'approach':12 'first':11 'go':4,6 'lidar':10 'lidar-first':9 'probabl':3 'yup':1"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212524"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906726 {#4274
      date: 2023-09-05 11:38:46.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\BoostComponent {#10443
  +formDest: "entry_comment"
  +subject: App\Entity\EntryComment {#4270
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4186
      +user: App\Entity\User {#4199
        +avatar: null
        +cover: null
        +email: "Sieguito@lemmy.world"
        +username: "@Sieguito@lemmy.world"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1693561112 {#4183
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
        +entries: Doctrine\ORM\PersistentCollection {#4206 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
        +posts: Doctrine\ORM\PersistentCollection {#4214 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
        +follows: Doctrine\ORM\PersistentCollection {#4226 …}
        +followers: Doctrine\ORM\PersistentCollection {#4228 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
        +reports: Doctrine\ORM\PersistentCollection {#4238 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
        +violations: Doctrine\ORM\PersistentCollection {#4242 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
        +awards: Doctrine\ORM\PersistentCollection {#4246 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
        +categories: Doctrine\ORM\PersistentCollection {#4250 …}
        -id: 29634
        -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
        +apId: "Sieguito@lemmy.world"
        +apProfileId: "https://lemmy.world/u/Sieguito"
        +apPublicUrl: "https://lemmy.world/u/Sieguito"
        +apFollowersUrl: null
        +apInboxUrl: "https://lemmy.world/inbox"
        +apDomain: "lemmy.world"
        +apPreferredUsername: "Sieguito"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1693561112 {#4184
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689503171 {#4185
          date: 2023-07-16 12:26:11.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906728 {#4181
        date: 2023-09-05 11:38:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4187 …}
      +nested: Doctrine\ORM\PersistentCollection {#4189 …}
      +votes: Doctrine\ORM\PersistentCollection {#4191 …}
      +reports: Doctrine\ORM\PersistentCollection {#4193 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
      -id: 27587
      -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://lemmy.world/comment/3015237"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693561111 {#4182
        date: 2023-09-01 11:38:31.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4186}
    +body: "Yup. Agree. Probably going to go with a LiDAR-first approach."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906726 {#4271
      date: 2023-09-05 11:38:46.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@Sieguito@lemmy.world"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4267 …}
    +nested: Doctrine\ORM\PersistentCollection {#4263 …}
    +votes: Doctrine\ORM\PersistentCollection {#4261 …}
    +reports: Doctrine\ORM\PersistentCollection {#4276 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4278 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4280 …}
    -id: 28064
    -bodyTs: "'agre':2 'approach':12 'first':11 'go':4,6 'lidar':10 'lidar-first':9 'probabl':3 'yup':1"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212524"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906726 {#4274
      date: 2023-09-05 11:38:46.0 +02:00
    }
  }
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
entry_comments_nested App\Twig\Components\EntryCommentsNestedComponent 14.0 MiB 0.30 ms
Input props
[
  "comment" => App\Entity\EntryComment {#4270
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4186
      +user: App\Entity\User {#4199
        +avatar: null
        +cover: null
        +email: "Sieguito@lemmy.world"
        +username: "@Sieguito@lemmy.world"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1693561112 {#4183
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
        +entries: Doctrine\ORM\PersistentCollection {#4206 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
        +posts: Doctrine\ORM\PersistentCollection {#4214 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
        +follows: Doctrine\ORM\PersistentCollection {#4226 …}
        +followers: Doctrine\ORM\PersistentCollection {#4228 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
        +reports: Doctrine\ORM\PersistentCollection {#4238 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
        +violations: Doctrine\ORM\PersistentCollection {#4242 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
        +awards: Doctrine\ORM\PersistentCollection {#4246 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
        +categories: Doctrine\ORM\PersistentCollection {#4250 …}
        -id: 29634
        -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
        +apId: "Sieguito@lemmy.world"
        +apProfileId: "https://lemmy.world/u/Sieguito"
        +apPublicUrl: "https://lemmy.world/u/Sieguito"
        +apFollowersUrl: null
        +apInboxUrl: "https://lemmy.world/inbox"
        +apDomain: "lemmy.world"
        +apPreferredUsername: "Sieguito"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1693561112 {#4184
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689503171 {#4185
          date: 2023-07-16 12:26:11.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906728 {#4181
        date: 2023-09-05 11:38:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4187 …}
      +nested: Doctrine\ORM\PersistentCollection {#4189 …}
      +votes: Doctrine\ORM\PersistentCollection {#4191 …}
      +reports: Doctrine\ORM\PersistentCollection {#4193 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
      -id: 27587
      -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://lemmy.world/comment/3015237"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693561111 {#4182
        date: 2023-09-01 11:38:31.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4186}
    +body: "Yup. Agree. Probably going to go with a LiDAR-first approach."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906726 {#4271
      date: 2023-09-05 11:38:46.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@Sieguito@lemmy.world"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4267 …}
    +nested: Doctrine\ORM\PersistentCollection {#4263 …}
    +votes: Doctrine\ORM\PersistentCollection {#4261 …}
    +reports: Doctrine\ORM\PersistentCollection {#4276 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4278 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4280 …}
    -id: 28064
    -bodyTs: "'agre':2 'approach':12 'first':11 'go':4,6 'lidar':10 'lidar-first':9 'probabl':3 'yup':1"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212524"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906726 {#4274
      date: 2023-09-05 11:38:46.0 +02:00
    }
  }
  "level" => 2
  "showNested" => true
  "view" => "tree"
]
Attributes
[
  "showNested" => true
]
Component
App\Twig\Components\EntryCommentsNestedComponent {#10683
  +comment: App\Entity\EntryComment {#4270
    +user: Proxies\__CG__\App\Entity\User {#1961
      +avatar: null
      +cover: null
      +email: "Saigonauticon@voltage.vn"
      +username: "@Saigonauticon@voltage.vn"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: null
      +lastActive: DateTime @1703981706 {#1519
        date: 2023-12-31 01:15:06.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
      +entries: Doctrine\ORM\PersistentCollection {#1712 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
      +posts: Doctrine\ORM\PersistentCollection {#1753 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
      +follows: Doctrine\ORM\PersistentCollection {#1421 …}
      +followers: Doctrine\ORM\PersistentCollection {#1635 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
      +reports: Doctrine\ORM\PersistentCollection {#1454 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
      +violations: Doctrine\ORM\PersistentCollection {#1693 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
      +awards: Doctrine\ORM\PersistentCollection {#1438 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
      +categories: Doctrine\ORM\PersistentCollection {#1665 …}
      -id: 269
      -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
      +apId: "Saigonauticon@voltage.vn"
      +apProfileId: "https://voltage.vn/u/Saigonauticon"
      +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
      +apFollowersUrl: null
      +apInboxUrl: "https://voltage.vn/inbox"
      +apDomain: "voltage.vn"
      +apPreferredUsername: "Saigonauticon"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1709584336 {#1520
        date: 2024-03-04 21:32:16.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1686890246 {#1517
        date: 2023-06-16 06:37:26.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +entry: App\Entity\Entry {#2400
      +user: Proxies\__CG__\App\Entity\User {#1961 …2}
      +magazine: App\Entity\Magazine {#262
        +icon: Proxies\__CG__\App\Entity\Image {#242 …}
        +name: "askelectronics@discuss.tchncs.de"
        +title: "askelectronics"
        +description: """
          **For questions about component-level electronic circuits, tools and equipment.**\n
          \n
          Rules\n
          -----\n
          \n
          1: Be nice.\n
          \n
          2: Be on-topic (eg: *Electronic*, not *electrical*).\n
          \n
          3: No commercial stuff, buying, selling or valuations.\n
          \n
          4: Be safe.\n
          \n
          ---
          """
        +rules: null
        +subscriptionsCount: 1
        +entryCount: 154
        +entryCommentCount: 1230
        +postCount: 1
        +postCommentCount: 4
        +isAdult: false
        +customCss: null
        +lastActive: DateTime @1729413608 {#270
          date: 2024-10-20 10:40:08.0 +02:00
        }
        +markedForDeletionAt: null
        +tags: null
        +moderators: Doctrine\ORM\PersistentCollection {#233 …}
        +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
        +entries: Doctrine\ORM\PersistentCollection {#176 …}
        +posts: Doctrine\ORM\PersistentCollection {#134 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
        +bans: Doctrine\ORM\PersistentCollection {#113 …}
        +reports: Doctrine\ORM\PersistentCollection {#99 …}
        +badges: Doctrine\ORM\PersistentCollection {#77 …}
        +logs: Doctrine\ORM\PersistentCollection {#67 …}
        +awards: Doctrine\ORM\PersistentCollection {#2434 …}
        +categories: Doctrine\ORM\PersistentCollection {#1804 …}
        -id: 11
        +apId: "askelectronics@discuss.tchncs.de"
        +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
        +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
        +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
        +apInboxUrl: "https://discuss.tchncs.de/inbox"
        +apDomain: "discuss.tchncs.de"
        +apPreferredUsername: "askelectronics"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: null
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1727247714 {#268
          date: 2024-09-25 09:01:54.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1687144409 {#276
          date: 2023-06-19 05:13:29.0 +02:00
        }
      }
      +image: null
      +domain: Proxies\__CG__\App\Entity\Domain {#1894 …}
      +slug: "Considering-positioning-strategies-for-autonomous-mechanum-wheeled-robots"
      +title: "Considering positioning strategies for autonomous mechanum-wheeled robots"
      +url: null
      +body: """
        Disclaimer: this is not *specifically* for a commercial product, but various things I design sometimes get commercialized. I mention this so that you may decide whether you want to weigh in. If it’s commercialized, I will probably make very little money but a bunch of university students may get a neat STEM program in the countryside :D\n
        \n
        That out of the way, I’ve designed some boards for a Wi-Fi controlled robot with mechanum wheels. So 4 independent motor drivers, one for each wheel, allow omnidirectional motion. It’s built around a Pi Pico W, 4 SOIC-8 9110S motor drivers, and some buck/boost converters to give the system a 5V and 12V line. It’s very basic, mostly made to be cheap. Here’s a photo:\n
        \n
        ![](https://voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)\n
        \n
        Right now it just receives UDP communications (a little app written in Godot) and activates the motors in different combinations – very “hello world”. I’m planning to add some autonomy to move around pre-generated maps, solve mazes, and so on.\n
        \n
        I have foolishly used 2-pin JST connectors for the motors, so using motors with rotary encoders would be a pain without ordering new boards. I’ll probably fix that in a later board revision or just hack it in. Also the routing is sloppy and there’s no ground plane. It works well enough for development and testing though :D\n
        \n
        What I’m thinking about right now, is how to let the robot position itself in a room effectively and cheaply. I was thinking of adding either a full LiDAR or building a limited LiDAR out of a servo motor and two cheap laser ToF sensors – e.g. one pointed forward, the other back, and I can sweep it 90 degrees. Since the LiDAR does not need to be fast or continuously sweep, I am leaning toward the latter approach.\n
        \n
        Then the processing is handled remotely – a server requests that the robot do a LiDAR sweep, the robot sends a minimal point cloud back to the server, which estimates the robot’s current location and sends back some instructions to move in a direction for some distance – probably this is where the lack of rotary encoders is going to hurt, but for now I’m planning on just pointing the forward laser ToF sensor towards a target and give the instruction “turn or move forward at static speed X until the sensor reads Y”, which should be pretty easy for the MCU To handle.\n
        \n
        I’m planning to control multiple robots from the same server. The robots don’t need to be super fast.\n
        \n
        What I’m currently wondering is whether my approach really needs rotary encoders in practice – I’ve heard that mechanum wheels have high enough mechanical slippage that they end up inaccurate, and designers often add another set of unpowered wheels for position tracking anyway. I don’t want to add more wheels in this way though.\n
        \n
        On the other hand, it would probably be easier to tell the MCU to “move forward X rotary encoder pulses at a velocity defined by Y pulses per second, and then check position and correct at a lower speed” than to use a pure LiDAR approach (e.g. even if rotary encoders don’t give me accurate position, on small time scales, they give me good feedback to control speed). I could possibly even send a fairly complex series of instructions in one go, making the communications efficient enough to eliminate a local server and control a ton of robots from a cloud VPS or whatever.\n
        \n
        Anyone have some experience with encoders + mechanum wheels that can offer a few tips my way? At this stage the project doesn’t have clear engineering goals and this is mostly an academic exercise. I’ve read that using a rigid chassis and minimizing the need for lateral motion can reduce slippage, reading through a few papers didn’t get me any numerical indication of what to expect.
        """
      +type: "article"
      +lang: "en"
      +isOc: false
      +hasEmbed: false
      +commentCount: 10
      +favouriteCount: 14
      +score: 0
      +isAdult: false
      +sticky: false
      +lastActive: DateTime @1694071771 {#1828
        date: 2023-09-07 09:29:31.0 +02:00
      }
      +ip: null
      +adaAmount: 0
      +tags: null
      +mentions: null
      +comments: Doctrine\ORM\PersistentCollection {#1876 …}
      +votes: Doctrine\ORM\PersistentCollection {#1957 …}
      +reports: Doctrine\ORM\PersistentCollection {#1949 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1394 …}
      +notifications: Doctrine\ORM\PersistentCollection {#2436 …}
      +badges: Doctrine\ORM\PersistentCollection {#2166 …}
      +children: []
      -id: 2057
      -titleTs: "'autonom':5 'consid':1 'mechanum':7 'mechanum-wheel':6 'posit':2 'robot':9 'strategi':3 'wheel':8"
      -bodyTs: "'-8':101 '/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':133 '12v':116 '2':180 '4':80,99 '5v':114 '90':295 '9110s':102 'academ':633 'accur':551 'activ':148 'ad':262 'add':161,474,489 'allow':88 'also':216 'anoth':475 'anyon':601 'anyway':483 'app':143 'approach':315,448,541 'around':94,166 'autonomi':163 'back':289,339,352 'basic':121 'board':68,200,209 'buck/boost':107 'build':268 'built':93 'bunch':45 'chassi':642 'cheap':126,279 'cheapli':257 'check':527 'clear':625 'cloud':338,597 'combin':153 'commerci':8,17,35 'communic':140,581 'complex':572 'connector':183 'continu':307 'control':74,424,563,590 'convert':108 'correct':530 'could':566 'countrysid':57 'current':348,443 'd':58,236 'decid':25 'defin':519 'degre':296 'design':14,66,472 'develop':232 'didn':658 'differ':152 'direct':359 'disclaim':1 'distanc':362 'doesn':622 'driver':83,104 'e.g':283,542 'easi':414 'easier':504 'effect':255 'effici':582 'either':263 'elimin':585 'encod':192,371,452,514,546,606 'end':468 'engin':626 'enough':230,463,583 'estim':344 'even':543,568 'exercis':634 'expect':668 'experi':604 'fair':571 'fast':305,439 'feedback':561 'fi':73 'fix':204 'foolish':178 'forward':286,386,400,511 'full':265 'generat':169 'get':16,50,660 'give':110,394,549,558 'go':373,578 'goal':627 'godot':146 'good':560 'ground':225 'hack':213 'hand':499 'handl':320,419 'heard':457 'hello':155 'high':462 'hurt':375 'inaccur':470 'independ':81 'indic':664 'instruct':354,396,575 'jst':182 'lack':368 'laser':280,387 'later':208,648 'latter':314 'lean':311 'let':247 'lidar':266,271,299,330,540 'limit':270 'line':117 'littl':41,142 'll':202 'local':587 'locat':349 'lower':533 'm':158,239,380,421,442 'made':123 'make':39,579 'map':170 'may':24,49 'maze':172 'mcu':417,508 'mechan':464 'mechanum':77,459,607 'mention':19 'minim':336,644 'money':42 'most':122,631 'motion':90,649 'motor':82,103,150,186,189,276 'move':165,356,399,510 'multipl':425 'neat':52 'need':302,435,450,646 'new':199 'numer':663 'offer':611 'often':473 'omnidirect':89 'one':84,284,577 'order':198 'pain':196 'paper':657 'per':523 'photo':130 'pi':96 'pico':97 'pin':181 'plan':159,381,422 'plane':226 'point':285,337,384 'posit':250,481,528,552 'possibl':567 'practic':454 'pre':168 'pre-gener':167 'pretti':413 'probabl':38,203,363,502 'process':318 'product':9 'program':54 'project':621 'puls':515,522 'pure':539 'read':408,637,653 'realli':449 'receiv':138 'reduc':651 'remot':321 'request':324 'revis':210 'right':134,242 'rigid':641 'robot':75,249,327,333,346,426,432,594 'room':254 'rotari':191,370,451,513,545 'rout':218 'scale':556 'second':524 'send':334,351,569 'sensor':282,389,407 'seri':573 'server':323,342,430,588 'servo':275 'set':476 'sinc':297 'slippag':465,652 'sloppi':220 'small':554 'soic':100 'solv':171 'sometim':15 'specif':5 'speed':403,534,564 'stage':619 'static':402 'stem':53 'student':48 'super':438 'sweep':293,308,331 'system':112 'target':392 'tell':506 'test':234 'thing':12 'think':240,260 'though':235,495 'time':555 'tip':614 'tof':281,388 'ton':592 'toward':312,390 'track':482 'turn':397 'two':278 'udp':139 'univers':47 'unpow':478 'use':179,188,537,639 'various':11 've':65,456,636 'veloc':518 'voltage.vn':132 'voltage.vn/pictrs/image/bcdf7c0f-70f7-426d-9fef-d3d7191cf93e.jpeg)':131 'vps':598 'w':98 'want':28,487 'way':63,494,616 'weigh':30 'well':229 'whatev':600 'wheel':78,87,460,479,491,608 'whether':26,446 'wi':72 'wi-fi':71 'without':197 'wonder':444 'work':228 'world':156 'would':193,501 'written':144 'x':404,512 'y':409,521"
      +cross: false
      +upVotes: 0
      +downVotes: 0
      +ranking: 1693616717
      +visibility: "visible             "
      +apId: "https://voltage.vn/post/18974"
      +editedAt: DateTimeImmutable @1693550651 {#2414
        date: 2023-09-01 08:44:11.0 +02:00
      }
      +createdAt: DateTimeImmutable @1693550217 {#1570
        date: 2023-09-01 08:36:57.0 +02:00
      }
    }
    +magazine: App\Entity\Magazine {#262}
    +image: null
    +parent: App\Entity\EntryComment {#4186
      +user: App\Entity\User {#4199
        +avatar: null
        +cover: null
        +email: "Sieguito@lemmy.world"
        +username: "@Sieguito@lemmy.world"
        +roles: []
        +followersCount: 0
        +homepage: "front"
        +about: null
        +lastActive: DateTime @1693561112 {#4183
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +markedForDeletionAt: null
        +fields: null
        +oauthGithubId: null
        +oauthGoogleId: null
        +oauthFacebookId: null
        +oauthKeycloakId: null
        +hideAdult: true
        +showSubscribedUsers: true
        +showSubscribedMagazines: true
        +showSubscribedDomains: true
        +preferredLanguages: []
        +featuredMagazines: null
        +showProfileSubscriptions: true
        +showProfileFollowings: true
        +markNewComments: false
        +notifyOnNewEntry: false
        +notifyOnNewEntryReply: false
        +notifyOnNewEntryCommentReply: false
        +notifyOnNewPost: false
        +notifyOnNewPostReply: false
        +notifyOnNewPostCommentReply: false
        +addMentionsEntries: false
        +addMentionsPosts: true
        +isBanned: false
        +isVerified: false
        +isDeleted: false
        +isBot: false
        +spamProtection: true
        +customCss: null
        +ignoreMagazinesCustomCss: false
        +moderatorTokens: Doctrine\ORM\PersistentCollection {#4200 …}
        +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#4202 …}
        +moderatorRequests: Doctrine\ORM\PersistentCollection {#4204 …}
        +entries: Doctrine\ORM\PersistentCollection {#4206 …}
        +entryVotes: Doctrine\ORM\PersistentCollection {#4208 …}
        +entryComments: Doctrine\ORM\PersistentCollection {#4210 …}
        +entryCommentVotes: Doctrine\ORM\PersistentCollection {#4212 …}
        +posts: Doctrine\ORM\PersistentCollection {#4214 …}
        +postVotes: Doctrine\ORM\PersistentCollection {#4216 …}
        +postComments: Doctrine\ORM\PersistentCollection {#4218 …}
        +postCommentVotes: Doctrine\ORM\PersistentCollection {#4220 …}
        +subscriptions: Doctrine\ORM\PersistentCollection {#4222 …}
        +subscribedDomains: Doctrine\ORM\PersistentCollection {#4224 …}
        +follows: Doctrine\ORM\PersistentCollection {#4226 …}
        +followers: Doctrine\ORM\PersistentCollection {#4228 …}
        +blocks: Doctrine\ORM\PersistentCollection {#4230 …}
        +blockers: Doctrine\ORM\PersistentCollection {#4232 …}
        +blockedMagazines: Doctrine\ORM\PersistentCollection {#4234 …}
        +blockedDomains: Doctrine\ORM\PersistentCollection {#4236 …}
        +reports: Doctrine\ORM\PersistentCollection {#4238 …}
        +favourites: Doctrine\ORM\PersistentCollection {#4240 …}
        +violations: Doctrine\ORM\PersistentCollection {#4242 …}
        +notifications: Doctrine\ORM\PersistentCollection {#4244 …}
        +awards: Doctrine\ORM\PersistentCollection {#4246 …}
        +subscribedCategories: Doctrine\ORM\PersistentCollection {#4248 …}
        +categories: Doctrine\ORM\PersistentCollection {#4250 …}
        -id: 29634
        -password: "$2y$13$sQEfcIj9436ick55Hy4DBev2.6MPi9pw6kgrf3CcTOcQYZDJA04dm"
        -totpSecret: null
        -totpBackupCodes: []
        -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#4252 …}
        +apId: "Sieguito@lemmy.world"
        +apProfileId: "https://lemmy.world/u/Sieguito"
        +apPublicUrl: "https://lemmy.world/u/Sieguito"
        +apFollowersUrl: null
        +apInboxUrl: "https://lemmy.world/inbox"
        +apDomain: "lemmy.world"
        +apPreferredUsername: "Sieguito"
        +apDiscoverable: true
        +apManuallyApprovesFollowers: false
        +privateKey: null
        +publicKey: null
        +apFetchedAt: DateTime @1693561112 {#4184
          date: 2023-09-01 11:38:32.0 +02:00
        }
        +apDeletedAt: null
        +apTimeoutAt: null
        +visibility: "visible             "
        +createdAt: DateTimeImmutable @1689503171 {#4185
          date: 2023-07-16 12:26:11.0 +02:00
        }
      }
      +entry: App\Entity\Entry {#2400}
      +magazine: App\Entity\Magazine {#262}
      +image: null
      +parent: null
      +root: null
      +body: "Even though you add encoders on the wheels it’s still an open loop locomotion method, you need the room to have a feedback of the position on the plane/in the space"
      +lang: "en"
      +isAdult: false
      +favouriteCount: 0
      +score: 0
      +lastActive: DateTime @1693906728 {#4181
        date: 2023-09-05 11:38:48.0 +02:00
      }
      +ip: null
      +tags: null
      +mentions: [
        "@Saigonauticon@voltage.vn"
      ]
      +children: Doctrine\ORM\PersistentCollection {#4187 …}
      +nested: Doctrine\ORM\PersistentCollection {#4189 …}
      +votes: Doctrine\ORM\PersistentCollection {#4191 …}
      +reports: Doctrine\ORM\PersistentCollection {#4193 …}
      +favourites: Doctrine\ORM\PersistentCollection {#4195 …}
      +notifications: Doctrine\ORM\PersistentCollection {#4197 …}
      -id: 27587
      -bodyTs: "'add':4 'encod':5 'even':1 'feedback':24 'locomot':15 'loop':14 'method':16 'need':18 'open':13 'plane/in':30 'posit':27 'room':20 'space':32 'still':11 'though':2 'wheel':8"
      +ranking: 0
      +commentCount: 0
      +upVotes: 0
      +downVotes: 0
      +visibility: "visible             "
      +apId: "https://lemmy.world/comment/3015237"
      +editedAt: null
      +createdAt: DateTimeImmutable @1693561111 {#4182
        date: 2023-09-01 11:38:31.0 +02:00
      }
    }
    +root: App\Entity\EntryComment {#4186}
    +body: "Yup. Agree. Probably going to go with a LiDAR-first approach."
    +lang: "en"
    +isAdult: false
    +favouriteCount: 0
    +score: 0
    +lastActive: DateTime @1693906726 {#4271
      date: 2023-09-05 11:38:46.0 +02:00
    }
    +ip: null
    +tags: null
    +mentions: [
      "@Saigonauticon@voltage.vn"
      "@Sieguito@lemmy.world"
    ]
    +children: Doctrine\ORM\PersistentCollection {#4267 …}
    +nested: Doctrine\ORM\PersistentCollection {#4263 …}
    +votes: Doctrine\ORM\PersistentCollection {#4261 …}
    +reports: Doctrine\ORM\PersistentCollection {#4276 …}
    +favourites: Doctrine\ORM\PersistentCollection {#4278 …}
    +notifications: Doctrine\ORM\PersistentCollection {#4280 …}
    -id: 28064
    -bodyTs: "'agre':2 'approach':12 'first':11 'go':4,6 'lidar':10 'lidar-first':9 'probabl':3 'yup':1"
    +ranking: 0
    +commentCount: 0
    +upVotes: 0
    +downVotes: 0
    +visibility: "visible             "
    +apId: "https://voltage.vn/comment/212524"
    +editedAt: null
    +createdAt: DateTimeImmutable @1693906726 {#4274
      date: 2023-09-05 11:38:46.0 +02:00
    }
  }
  +nestedComments: []
  +level: 2
  +view: "tree"
  -entryCommentRepository: App\Repository\EntryCommentRepository {#557 …}
  -twig: Twig\Environment {#1252 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
settings_row_enum App\Twig\Components\SettingsRowEnumComponent 14.0 MiB 0.22 ms
Input props
[
  "label" => "Sidebar position"
  "settingsKey" => "KBIN_GENERAL_SIDEBAR_POSITION"
  "values" => [
    [
      "name" => "Left"
      "value" => "LEFT"
    ]
    [
      "name" => "Right"
      "value" => "RIGHT"
    ]
  ]
  "defaultValue" => "RIGHT"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowEnumComponent {#10814
  +label: "Sidebar position"
  +help: ""
  +settingsKey: "KBIN_GENERAL_SIDEBAR_POSITION"
  +values: [
    [
      "name" => "Left"
      "value" => "LEFT"
    ]
    [
      "name" => "Right"
      "value" => "RIGHT"
    ]
  ]
  +defaultValue: "RIGHT"
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.19 ms
Input props
[
  "label" => "Dynamic lists"
  "settingsKey" => "KBIN_GENERAL_DYNAMIC_LISTS"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#10878
  +label: "Dynamic lists"
  +help: ""
  +settingsKey: "KBIN_GENERAL_DYNAMIC_LISTS"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.13 ms
Input props
[
  "label" => "Rounded edges"
  "settingsKey" => "KBIN_GENERAL_ROUNDED_EDGES"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#10943
  +label: "Rounded edges"
  +help: ""
  +settingsKey: "KBIN_GENERAL_ROUNDED_EDGES"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.13 ms
Input props
[
  "label" => "Infinite scrolling"
  "help" => "Automatically load more content when you reach the bottom of the page."
  "settingsKey" => "KBIN_GENERAL_INFINITE_SCROLL"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#10999
  +label: "Infinite scrolling"
  +help: "Automatically load more content when you reach the bottom of the page."
  +settingsKey: "KBIN_GENERAL_INFINITE_SCROLL"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.13 ms
Input props
[
  "label" => "Sticky navbar"
  "help" => "The navbar will stick to the top of the page when you scroll down."
  "settingsKey" => "KBIN_GENERAL_FIXED_NAVBAR"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#11058
  +label: "Sticky navbar"
  +help: "The navbar will stick to the top of the page when you scroll down."
  +settingsKey: "KBIN_GENERAL_FIXED_NAVBAR"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.12 ms
Input props
[
  "label" => "Show top bar"
  "settingsKey" => "KBIN_GENERAL_TOPBAR"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#11114
  +label: "Show top bar"
  +help: ""
  +settingsKey: "KBIN_GENERAL_TOPBAR"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.12 ms
Input props
[
  "label" => "Turbo mode (experimental)"
  "settingsKey" => "KBIN_GENERAL_TURBO"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#11170
  +label: "Turbo mode (experimental)"
  +help: ""
  +settingsKey: "KBIN_GENERAL_TURBO"
  +defaultValue: false
  +reloadRequired: true
}
user_settings_row_switch App\Twig\Components\UserSettingsRowSwitchComponent 14.0 MiB 0.23 ms
Input props
[
  "label" => "Mark new comments"
  "settingsKey" => "KBIN_MARK_NEW_COMMENTS"
]
Attributes
[]
Component
App\Twig\Components\UserSettingsRowSwitchComponent {#11228
  +label: "Mark new comments"
  +help: ""
  +settingsKey: "KBIN_MARK_NEW_COMMENTS"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.16 ms
Input props
[
  "label" => "Show "Support Us" block"
  "settingsKey" => "KBIN_GENERAL_SUPPORT_US_BLOCK"
  "defaultValue" => true
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#11291
  +label: "Show "Support Us" block"
  +help: ""
  +settingsKey: "KBIN_GENERAL_SUPPORT_US_BLOCK"
  +defaultValue: true
  +reloadRequired: true
}
user_settings_row_switch App\Twig\Components\UserSettingsRowSwitchComponent 14.0 MiB 0.20 ms
Input props
[
  "label" => "Show subscribed users"
  "settingsKey" => "KBIN_SUB_CHANNEL_USERS"
]
Attributes
[]
Component
App\Twig\Components\UserSettingsRowSwitchComponent {#11349
  +label: "Show subscribed users"
  +help: ""
  +settingsKey: "KBIN_SUB_CHANNEL_USERS"
  +defaultValue: false
  +reloadRequired: true
}
user_settings_row_switch App\Twig\Components\UserSettingsRowSwitchComponent 14.0 MiB 0.18 ms
Input props
[
  "label" => "Show subscribed magazines"
  "settingsKey" => "KBIN_SUB_CHANNEL_MAGAZINES"
]
Attributes
[]
Component
App\Twig\Components\UserSettingsRowSwitchComponent {#11405
  +label: "Show subscribed magazines"
  +help: ""
  +settingsKey: "KBIN_SUB_CHANNEL_MAGAZINES"
  +defaultValue: false
  +reloadRequired: true
}
user_settings_row_switch App\Twig\Components\UserSettingsRowSwitchComponent 14.0 MiB 0.15 ms
Input props
[
  "label" => "Show subscribed domains"
  "settingsKey" => "KBIN_SUB_CHANNEL_DOMAINS"
]
Attributes
[]
Component
App\Twig\Components\UserSettingsRowSwitchComponent {#11461
  +label: "Show subscribed domains"
  +help: ""
  +settingsKey: "KBIN_SUB_CHANNEL_DOMAINS"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.13 ms
Input props
[
  "label" => "Auto media preview"
  "help" => "Automatically expand media previews."
  "settingsKey" => "KBIN_ENTRIES_SHOW_PREVIEW"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#11517
  +label: "Auto media preview"
  +help: "Automatically expand media previews."
  +settingsKey: "KBIN_ENTRIES_SHOW_PREVIEW"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.12 ms
Input props
[
  "label" => "Compact view"
  "settingsKey" => "KBIN_ENTRIES_COMPACT"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#11573
  +label: "Compact view"
  +help: ""
  +settingsKey: "KBIN_ENTRIES_COMPACT"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.12 ms
Input props
[
  "label" => "Show users’ avatars"
  "settingsKey" => "KBIN_ENTRIES_SHOW_USERS_AVATARS"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#11629
  +label: "Show users’ avatars"
  +help: ""
  +settingsKey: "KBIN_ENTRIES_SHOW_USERS_AVATARS"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.12 ms
Input props
[
  "label" => "Show magazines’ icons"
  "settingsKey" => "KBIN_ENTRIES_SHOW_MAGAZINES_ICONS"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#11685
  +label: "Show magazines’ icons"
  +help: ""
  +settingsKey: "KBIN_ENTRIES_SHOW_MAGAZINES_ICONS"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.14 ms
Input props
[
  "label" => "Show thumbnails"
  "settingsKey" => "KBIN_ENTRIES_SHOW_THUMBNAILS"
  "defaultValue" => true
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#11741
  +label: "Show thumbnails"
  +help: ""
  +settingsKey: "KBIN_ENTRIES_SHOW_THUMBNAILS"
  +defaultValue: true
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.12 ms
Input props
[
  "label" => "Auto media preview"
  "help" => "Automatically expand media previews."
  "settingsKey" => "KBIN_POSTS_SHOW_PREVIEW"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#11797
  +label: "Auto media preview"
  +help: "Automatically expand media previews."
  +settingsKey: "KBIN_POSTS_SHOW_PREVIEW"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.12 ms
Input props
[
  "label" => "Show users’ avatars"
  "settingsKey" => "KBIN_POSTS_SHOW_USERS_AVATARS"
  "defaultValue" => true
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#11853
  +label: "Show users’ avatars"
  +help: ""
  +settingsKey: "KBIN_POSTS_SHOW_USERS_AVATARS"
  +defaultValue: true
  +reloadRequired: true
}
settings_row_enum App\Twig\Components\SettingsRowEnumComponent 14.0 MiB 0.15 ms
Input props
[
  "label" => "Comment reply position"
  "help" => "Display the comment reply form either at the top or bottom of the page. When 'infinite scroll' is enabled the position will always appear at the top."
  "settingsKey" => "KBIN_COMMENTS_REPLY_POSITION"
  "values" => [
    [
      "name" => "top"
      "value" => "TOP"
    ]
    [
      "name" => "bottom"
      "value" => "BOTTOM"
    ]
  ]
  "defaultValue" => "TOP"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowEnumComponent {#11909
  +label: "Comment reply position"
  +help: "Display the comment reply form either at the top or bottom of the page. When 'infinite scroll' is enabled the position will always appear at the top."
  +settingsKey: "KBIN_COMMENTS_REPLY_POSITION"
  +values: [
    [
      "name" => "top"
      "value" => "TOP"
    ]
    [
      "name" => "bottom"
      "value" => "BOTTOM"
    ]
  ]
  +defaultValue: "TOP"
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 14.0 MiB 0.15 ms
Input props
[
  "label" => "Show Comment Avatars"
  "help" => "Display/hide user avatars when viewing comments on a single thread or post."
  "settingsKey" => "KBIN_COMMENTS_SHOW_USER_AVATAR"
  "defaultValue" => true
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#11967
  +label: "Show Comment Avatars"
  +help: "Display/hide user avatars when viewing comments on a single thread or post."
  +settingsKey: "KBIN_COMMENTS_SHOW_USER_AVATAR"
  +defaultValue: true
  +reloadRequired: true
}
user_actions App\Twig\Components\UserActionsComponent 14.0 MiB 0.45 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
]
Attributes
[]
Component
App\Twig\Components\UserActionsComponent {#12044
  +user: Proxies\__CG__\App\Entity\User {#1961
    +avatar: null
    +cover: null
    +email: "Saigonauticon@voltage.vn"
    +username: "@Saigonauticon@voltage.vn"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: null
    +lastActive: DateTime @1703981706 {#1519
      date: 2023-12-31 01:15:06.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#1632 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#1631 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#1704 …}
    +entries: Doctrine\ORM\PersistentCollection {#1712 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#1706 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#1657 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#1467 …}
    +posts: Doctrine\ORM\PersistentCollection {#1753 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#1494 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1788 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1643 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1761 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1409 …}
    +follows: Doctrine\ORM\PersistentCollection {#1421 …}
    +followers: Doctrine\ORM\PersistentCollection {#1635 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1456 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1419 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1432 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#1436 …}
    +reports: Doctrine\ORM\PersistentCollection {#1454 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1440 …}
    +violations: Doctrine\ORM\PersistentCollection {#1693 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1695 …}
    +awards: Doctrine\ORM\PersistentCollection {#1438 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1614 …}
    +categories: Doctrine\ORM\PersistentCollection {#1665 …}
    -id: 269
    -password: "$2y$13$UYqaD7bZp4O.OwB02SlMIeKWP1aeHwuKf.UMqd1I/0STqvflxyU5K"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1667 …}
    +apId: "Saigonauticon@voltage.vn"
    +apProfileId: "https://voltage.vn/u/Saigonauticon"
    +apPublicUrl: "https://voltage.vn/u/Saigonauticon"
    +apFollowersUrl: null
    +apInboxUrl: "https://voltage.vn/inbox"
    +apDomain: "voltage.vn"
    +apPreferredUsername: "Saigonauticon"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1709584336 {#1520
      date: 2024-03-04 21:32:16.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686890246 {#1517
      date: 2023-06-16 06:37:26.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
}
date App\Twig\Components\DateComponent 14.0 MiB 0.13 ms
Input props
[
  "date" => DateTimeImmutable @1693550217 {#1570
    date: 2023-09-01 08:36:57.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#12105
  +date: DateTimeImmutable @1693550217 {#1570
    date: 2023-09-01 08:36:57.0 +02:00
  }
}
magazine_box App\Twig\Components\MagazineBoxComponent 14.0 MiB 6.48 ms
Input props
[
  "magazine" => App\Entity\Magazine {#262
    +icon: Proxies\__CG__\App\Entity\Image {#242 …}
    +name: "askelectronics@discuss.tchncs.de"
    +title: "askelectronics"
    +description: """
      **For questions about component-level electronic circuits, tools and equipment.**\n
      \n
      Rules\n
      -----\n
      \n
      1: Be nice.\n
      \n
      2: Be on-topic (eg: *Electronic*, not *electrical*).\n
      \n
      3: No commercial stuff, buying, selling or valuations.\n
      \n
      4: Be safe.\n
      \n
      ---
      """
    +rules: null
    +subscriptionsCount: 1
    +entryCount: 154
    +entryCommentCount: 1230
    +postCount: 1
    +postCommentCount: 4
    +isAdult: false
    +customCss: null
    +lastActive: DateTime @1729413608 {#270
      date: 2024-10-20 10:40:08.0 +02:00
    }
    +markedForDeletionAt: null
    +tags: null
    +moderators: Doctrine\ORM\PersistentCollection {#233 …}
    +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
    +entries: Doctrine\ORM\PersistentCollection {#176 …}
    +posts: Doctrine\ORM\PersistentCollection {#134 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
    +bans: Doctrine\ORM\PersistentCollection {#113 …}
    +reports: Doctrine\ORM\PersistentCollection {#99 …}
    +badges: Doctrine\ORM\PersistentCollection {#77 …}
    +logs: Doctrine\ORM\PersistentCollection {#67 …}
    +awards: Doctrine\ORM\PersistentCollection {#2434 …}
    +categories: Doctrine\ORM\PersistentCollection {#1804 …}
    -id: 11
    +apId: "askelectronics@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
    +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
    +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "askelectronics"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: null
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1727247714 {#268
      date: 2024-09-25 09:01:54.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1687144409 {#276
      date: 2023-06-19 05:13:29.0 +02:00
    }
  }
  "showSectionTitle" => true
]
Attributes
[]
Component
App\Twig\Components\MagazineBoxComponent {#12161
  +magazine: App\Entity\Magazine {#262
    +icon: Proxies\__CG__\App\Entity\Image {#242 …}
    +name: "askelectronics@discuss.tchncs.de"
    +title: "askelectronics"
    +description: """
      **For questions about component-level electronic circuits, tools and equipment.**\n
      \n
      Rules\n
      -----\n
      \n
      1: Be nice.\n
      \n
      2: Be on-topic (eg: *Electronic*, not *electrical*).\n
      \n
      3: No commercial stuff, buying, selling or valuations.\n
      \n
      4: Be safe.\n
      \n
      ---
      """
    +rules: null
    +subscriptionsCount: 1
    +entryCount: 154
    +entryCommentCount: 1230
    +postCount: 1
    +postCommentCount: 4
    +isAdult: false
    +customCss: null
    +lastActive: DateTime @1729413608 {#270
      date: 2024-10-20 10:40:08.0 +02:00
    }
    +markedForDeletionAt: null
    +tags: null
    +moderators: Doctrine\ORM\PersistentCollection {#233 …}
    +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
    +entries: Doctrine\ORM\PersistentCollection {#176 …}
    +posts: Doctrine\ORM\PersistentCollection {#134 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
    +bans: Doctrine\ORM\PersistentCollection {#113 …}
    +reports: Doctrine\ORM\PersistentCollection {#99 …}
    +badges: Doctrine\ORM\PersistentCollection {#77 …}
    +logs: Doctrine\ORM\PersistentCollection {#67 …}
    +awards: Doctrine\ORM\PersistentCollection {#2434 …}
    +categories: Doctrine\ORM\PersistentCollection {#1804 …}
    -id: 11
    +apId: "askelectronics@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
    +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
    +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "askelectronics"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: null
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1727247714 {#268
      date: 2024-09-25 09:01:54.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1687144409 {#276
      date: 2023-06-19 05:13:29.0 +02:00
    }
  }
  +showCover: true
  +showDescription: true
  +showRules: true
  +showSubscribeButton: true
  +showInfo: true
  +showMeta: true
  +showSectionTitle: true
  +stretchedLink: true
}
magazine_sub App\Twig\Components\MagazineSubComponent 14.0 MiB 0.43 ms
Input props
[
  "magazine" => App\Entity\Magazine {#262
    +icon: Proxies\__CG__\App\Entity\Image {#242 …}
    +name: "askelectronics@discuss.tchncs.de"
    +title: "askelectronics"
    +description: """
      **For questions about component-level electronic circuits, tools and equipment.**\n
      \n
      Rules\n
      -----\n
      \n
      1: Be nice.\n
      \n
      2: Be on-topic (eg: *Electronic*, not *electrical*).\n
      \n
      3: No commercial stuff, buying, selling or valuations.\n
      \n
      4: Be safe.\n
      \n
      ---
      """
    +rules: null
    +subscriptionsCount: 1
    +entryCount: 154
    +entryCommentCount: 1230
    +postCount: 1
    +postCommentCount: 4
    +isAdult: false
    +customCss: null
    +lastActive: DateTime @1729413608 {#270
      date: 2024-10-20 10:40:08.0 +02:00
    }
    +markedForDeletionAt: null
    +tags: null
    +moderators: Doctrine\ORM\PersistentCollection {#233 …}
    +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
    +entries: Doctrine\ORM\PersistentCollection {#176 …}
    +posts: Doctrine\ORM\PersistentCollection {#134 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
    +bans: Doctrine\ORM\PersistentCollection {#113 …}
    +reports: Doctrine\ORM\PersistentCollection {#99 …}
    +badges: Doctrine\ORM\PersistentCollection {#77 …}
    +logs: Doctrine\ORM\PersistentCollection {#67 …}
    +awards: Doctrine\ORM\PersistentCollection {#2434 …}
    +categories: Doctrine\ORM\PersistentCollection {#1804 …}
    -id: 11
    +apId: "askelectronics@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
    +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
    +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "askelectronics"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: null
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1727247714 {#268
      date: 2024-09-25 09:01:54.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1687144409 {#276
      date: 2023-06-19 05:13:29.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\MagazineSubComponent {#12219
  +magazine: App\Entity\Magazine {#262
    +icon: Proxies\__CG__\App\Entity\Image {#242 …}
    +name: "askelectronics@discuss.tchncs.de"
    +title: "askelectronics"
    +description: """
      **For questions about component-level electronic circuits, tools and equipment.**\n
      \n
      Rules\n
      -----\n
      \n
      1: Be nice.\n
      \n
      2: Be on-topic (eg: *Electronic*, not *electrical*).\n
      \n
      3: No commercial stuff, buying, selling or valuations.\n
      \n
      4: Be safe.\n
      \n
      ---
      """
    +rules: null
    +subscriptionsCount: 1
    +entryCount: 154
    +entryCommentCount: 1230
    +postCount: 1
    +postCommentCount: 4
    +isAdult: false
    +customCss: null
    +lastActive: DateTime @1729413608 {#270
      date: 2024-10-20 10:40:08.0 +02:00
    }
    +markedForDeletionAt: null
    +tags: null
    +moderators: Doctrine\ORM\PersistentCollection {#233 …}
    +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
    +entries: Doctrine\ORM\PersistentCollection {#176 …}
    +posts: Doctrine\ORM\PersistentCollection {#134 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
    +bans: Doctrine\ORM\PersistentCollection {#113 …}
    +reports: Doctrine\ORM\PersistentCollection {#99 …}
    +badges: Doctrine\ORM\PersistentCollection {#77 …}
    +logs: Doctrine\ORM\PersistentCollection {#67 …}
    +awards: Doctrine\ORM\PersistentCollection {#2434 …}
    +categories: Doctrine\ORM\PersistentCollection {#1804 …}
    -id: 11
    +apId: "askelectronics@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
    +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
    +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "askelectronics"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: null
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1727247714 {#268
      date: 2024-09-25 09:01:54.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1687144409 {#276
      date: 2023-06-19 05:13:29.0 +02:00
    }
  }
}
date App\Twig\Components\DateComponent 14.0 MiB 0.17 ms
Input props
[
  "date" => DateTimeImmutable @1687144409 {#276
    date: 2023-06-19 05:13:29.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#12331
  +date: DateTimeImmutable @1687144409 {#276
    date: 2023-06-19 05:13:29.0 +02:00
  }
}
user_inline App\Twig\Components\UserInlineComponent 14.0 MiB 0.50 ms
Input props
[
  "user" => Proxies\__CG__\App\Entity\User {#12390
    +avatar: null
    +cover: null
    +email: "kbin@j0h.nl"
    +username: "Sprite_tm"
    +roles: [
      "ROLE_ADMIN"
    ]
    +followersCount: 0
    +homepage: "front"
    +about: "Hi! I'm Sprite_tm. You may know me from sites like https://spritesmods.com."
    +lastActive: DateTime @1707547382 {#12437
      date: 2024-02-10 07:43:02.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: true
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#12439 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#12441 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#12443 …}
    +entries: Doctrine\ORM\PersistentCollection {#12445 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#12447 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#12449 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#12451 …}
    +posts: Doctrine\ORM\PersistentCollection {#12453 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#12455 …}
    +postComments: Doctrine\ORM\PersistentCollection {#12457 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#12459 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#12461 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#12463 …}
    +follows: Doctrine\ORM\PersistentCollection {#12465 …}
    +followers: Doctrine\ORM\PersistentCollection {#12467 …}
    +blocks: Doctrine\ORM\PersistentCollection {#12469 …}
    +blockers: Doctrine\ORM\PersistentCollection {#12471 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#12473 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#12475 …}
    +reports: Doctrine\ORM\PersistentCollection {#12477 …}
    +favourites: Doctrine\ORM\PersistentCollection {#12479 …}
    +violations: Doctrine\ORM\PersistentCollection {#12481 …}
    +notifications: Doctrine\ORM\PersistentCollection {#12483 …}
    +awards: Doctrine\ORM\PersistentCollection {#12485 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#12487 …}
    +categories: Doctrine\ORM\PersistentCollection {#12489 …}
    -id: 1
    -password: "$2y$13$ZX7Aou2QOPRGkHPp4y5x8OWfxZMoT1BGH7bRLlPP7mwZFTkfiaPGG"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#12491 …}
    +apId: null
    +apProfileId: null
    +apPublicUrl: null
    +apFollowersUrl: null
    +apInboxUrl: null
    +apDomain: null
    +apPreferredUsername: null
    +apDiscoverable: null
    +apManuallyApprovesFollowers: null
    +privateKey: """
      -----BEGIN PRIVATE KEY-----\r\n
      MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDleeotz5TBiMlC\r\n
      YsJYJHVNxjvnvt0qsQA282B7vdqBTbARfD49iKPiMIwgU2yhCI0oTSQwc2Zy9AQ+\r\n
      31rwmvBx8VvcLgQvKpNzPVhMQjelK7k5iPiPc/W1soaauepq3YwQKgGod4c5Vh9f\r\n
      MInSANfOLOUSo3pUzfaQaGEvQc5DbKjDgIjsv/OKI1acbzu067KQzIThu+1BvcqQ\r\n
      Ypo2Ux5W23nNqkrRZ++z/r1MI2jS3vwi5OSwz4fWhLPJXE6lwokc6b/uAZe7sLT6\r\n
      QQtjevLnmMyRIVnmxbtHPMSfhLdz8ssQhoNCfAkMnBjDUX31SSs67pU8v5O3Fn2H\r\n
      d+qFWCjrREwSpBAd24INJqKsjSa6j3oLL8Xw8HZf+x6QRPJch/c3FNWRtM2b9n8V\r\n
      sAQiD985pafyeQ1TqIe4iSjI0iUgy2WgwO0C1Z0PNbQzQmRk0EOAlxIXjPmB229P\r\n
      V4+OcZxLT9phP/rid1Qt9Ro+2LdkS9Zqe8c2JHeJKc5Nv/8OOX5uQ/B82JXnuXYi\r\n
      /oVEJb5t42G8u3IIkYM5G/Gt033WU6dbyKOBmdnbXaPw9LC3M7oop3yyCb3UDLfg\r\n
      g/XnZVvZxSPCPlh5G1Lb0r47siKq/0k9YRua0AFsVg0dhqfuwsb6G9Hx5EicuPsu\r\n
      OIjXINBTjlnE4SdMz0ZJt7bLjwlKdQIDAQABAoICAAlWo8QHfYs+sMoF0Njbavam\r\n
      SYvNxZxWJacW0mdWu4ylh7O+dZ31cI3k4d7y5inLeksYkI90MsgczAtu9XlzJLPO\r\n
      WamlKcBtoCCBb5Vy4GbVV61SuKLF2krxn+6uAC8nIusJepXLf3JC4fXyuLkWFbIr\r\n
      O4s9od3Pn+gSh1nv+J/fzSJfmbLgwN1vQLgPAsQDD3o7CHFTP318ZsDnclUhnst0\r\n
      FQnckzzgWO3fQP7XNg3WyzX0UKYtW97L+bEJE55FQ2Us0gWyhOU7dLH2casztqzc\r\n
      F/8T91+fzlZAz9OaCAks6Tyb7L2I5KlhtNRF/bU8rAiy6tnVBgLeZG9d3upcQxX0\r\n
      L+SMPWg55qERGI5mO+BxFdUnVtcmswziKmySYtzgm+c4jmPS5cWhGB9HFCTW2S0x\r\n
      GoVA2cZGWjMTrbZQhgJjBqzp76fhLtXTufd328sYmX7fBYKEWFYNwrEJaWYUNl/V\r\n
      yEyl0aMQWKhVokx6eCqnuDZUc77LeuGuCleIdhQ53NYHrXMCmgVyLfmGdrOS3Uh6\r\n
      RrAYmnvvMkAUTOQajW2csC345PmgBOjE7vB7349ylKUkXvN4L+9xZCYaVjBt3O24\r\n
      aRoQSQDGhk+NIaYleiFx+u7dJSryxdx/6ut6dQ2S+jKlm1oN1qq6ppO5y/TFRQ1e\r\n
      qn7kjIGzUT80fANDFqdhAoIBAQD1+cGiWXRQhUrJc5X3ngH1zHoLWpmSZcUUDFn/\r\n
      bV/CChd2M43fOpneIQETZ1oS7BsU3y92kTw63ytYOUg7C5iT5/r9ZoBGq0HZSbll\r\n
      riRJWGiajr2aYCmIes++CrfUvCcD6+l8QMZ3s8eXdk80GX+vt1xEfRpWV9e9huJK\r\n
      K1e8wXfFmPAmxUi63IePscdc+SVQGeooMYDnMwLWvxpAtp5mGOaQc4D5dviWXjSE\r\n
      Z/PJa+gectpD1iDIPUXm3o17ivE2UYFia8/FCGUN6Yz7ucRKF+2SPO8hLefk5UvJ\r\n
      Lxlkh67MXKkneDqRU9C82Qmcfz5nQLQadC0nbE44YeXrnlIdAoIBAQDu1AWMIe6f\r\n
      7TZYCWnTa3nT6penJ9CMaGDPI/62dKTmGnI4oo3u9DGGrnuWbcFFCQA02vcYdpuw\r\n
      CVy6mkP/yqN5VSV3EHZiJUA0aKIxot3o3YOiobpVYn9hwvzzOdMZO4SOuevNfY1c\r\n
      qmnLGhYoDvR1c2yaudCf/BDwQqlLoSg9F5X57bRtwaRyUjhtXVKXWb59qtiwwrvp\r\n
      1vPjxciEIxAtgSXtIUQz3ljDRNUHjpyfYM3ska5jkxMIPNYUYFMX2x+Gxn9PZEG3\r\n
      Im391BRynZsnkvJO6i4i5N1xsPK5SyPiKBnlMxW/6ZLi5aAQHV3cc2KLzV+T+s2B\r\n
      v9LTAyO7nWo5AoIBAASA/jqqyKZwyl3F8AkIq6CEjfeHQSidFG65iyxSJF65MJTJ\r\n
      fN+Jgye+Evb3/X47NIO9UnEpV6D8VR7YbaonHDQZG09ogRDKMfp4jxx9g8yUAdZS\r\n
      psYc3KXTGdqw94y9pTk9KJlN1lR6xjzPvcOGdAATq2zVnZXXJewifCI/iOu73yWP\r\n
      F1aeZiaFwzWuW6goJ7a/wrnZrjKNjI/CEAj/TwcvjYk3lDT9KLAYKX4DKUOW5jko\r\n
      gTacxRzlglIn4Q9SC/iipWvX7YX+EVuf2yUA0cdJiOAUnYxN+uEGEc0tP5nHoju7\r\n
      tp0yZmAi2L+cecCT0+CwHpwdZHZEVWpS4JLf40ECggEBALFSZIgGDZlaU5YL7zHV\r\n
      Q5APRugKDLKjMPW7IPwxINnj2tioAL/hOQBpfkNTXEM4ipmz1fCo57FNUjcOINzD\r\n
      hJqqmHWNmIgIZmJDKeG2rhKenYTblXCeADwCvTKNxWmfoi0iZ6ybwqCBuqjcxoSZ\r\n
      jfHCcGl0+yw9yAnLRM1ta2XopCb70ZIIS2PCHjk9J/xN2ryNY/PhsgnN2ilMiTNq\r\n
      oTFYCWPF5lCojrj020KQJUPEaUBzbcpqwZ/FI6HfXvKAdCjqKk40/wHNI2Np2oC6\r\n
      +h7o4NWs0/J+gNhP6/edjZf19DwTsNtbvf6PRUeRtkXeudVY99T0Sy9B0HNxik9b\r\n
      cikCggEAM2wassiP1i0Gc3wrbNLHyQN+yqMaAp0xF+8l0fU3T8zPL/tYDcITnZPY\r\n
      pEFV/aodP9X7XFuQD0iGTOTGDXiMSLPOLI/ifmwbT41rgIN9x14MpU2EtWeVz7sx\r\n
      ZIFMt98rHx6BsZx/DnSFDQ8iqrKF3u+OOv7s6j+8odz4Rq53+16vMev5VUMOPq+E\r\n
      aQn8SDKkOjZzwb9QGB9bXS5s9yyj4pLyggQ0O5S2ugZjUcmCecNpktN8bUR3I9VQ\r\n
      KWkcQa9yCpidp/JYrQtlbqAPiIzptA4T4RNh+F6pKbmw7hNMIPipPzbQezEMaBOn\r\n
      Cgb38EldyAVGjCzRGfhu9SNU9B03bg==\r\n
      -----END PRIVATE KEY-----
      """
    +publicKey: """
      -----BEGIN PUBLIC KEY-----\r\n
      MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5XnqLc+UwYjJQmLCWCR1\r\n
      TcY7577dKrEANvNge73agU2wEXw+PYij4jCMIFNsoQiNKE0kMHNmcvQEPt9a8Jrw\r\n
      cfFb3C4ELyqTcz1YTEI3pSu5OYj4j3P1tbKGmrnqat2MECoBqHeHOVYfXzCJ0gDX\r\n
      zizlEqN6VM32kGhhL0HOQ2yow4CI7L/ziiNWnG87tOuykMyE4bvtQb3KkGKaNlMe\r\n
      Vtt5zapK0Wfvs/69TCNo0t78IuTksM+H1oSzyVxOpcKJHOm/7gGXu7C0+kELY3ry\r\n
      55jMkSFZ5sW7RzzEn4S3c/LLEIaDQnwJDJwYw1F99UkrOu6VPL+TtxZ9h3fqhVgo\r\n
      60RMEqQQHduCDSairI0muo96Cy/F8PB2X/sekETyXIf3NxTVkbTNm/Z/FbAEIg/f\r\n
      OaWn8nkNU6iHuIkoyNIlIMtloMDtAtWdDzW0M0JkZNBDgJcSF4z5gdtvT1ePjnGc\r\n
      S0/aYT/64ndULfUaPti3ZEvWanvHNiR3iSnOTb//Djl+bkPwfNiV57l2Iv6FRCW+\r\n
      beNhvLtyCJGDORvxrdN91lOnW8ijgZnZ212j8PSwtzO6KKd8sgm91Ay34IP152Vb\r\n
      2cUjwj5YeRtS29K+O7Iiqv9JPWEbmtABbFYNHYan7sLG+hvR8eRInLj7LjiI1yDQ\r\n
      U45ZxOEnTM9GSbe2y48JSnUCAwEAAQ==\r\n
      -----END PUBLIC KEY-----
      """
    +apFetchedAt: null
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686560440 {#12438
      date: 2023-06-12 11:00:40.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#12408
  +user: Proxies\__CG__\App\Entity\User {#12390
    +avatar: null
    +cover: null
    +email: "kbin@j0h.nl"
    +username: "Sprite_tm"
    +roles: [
      "ROLE_ADMIN"
    ]
    +followersCount: 0
    +homepage: "front"
    +about: "Hi! I'm Sprite_tm. You may know me from sites like https://spritesmods.com."
    +lastActive: DateTime @1707547382 {#12437
      date: 2024-02-10 07:43:02.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: true
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#12439 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#12441 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#12443 …}
    +entries: Doctrine\ORM\PersistentCollection {#12445 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#12447 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#12449 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#12451 …}
    +posts: Doctrine\ORM\PersistentCollection {#12453 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#12455 …}
    +postComments: Doctrine\ORM\PersistentCollection {#12457 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#12459 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#12461 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#12463 …}
    +follows: Doctrine\ORM\PersistentCollection {#12465 …}
    +followers: Doctrine\ORM\PersistentCollection {#12467 …}
    +blocks: Doctrine\ORM\PersistentCollection {#12469 …}
    +blockers: Doctrine\ORM\PersistentCollection {#12471 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#12473 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#12475 …}
    +reports: Doctrine\ORM\PersistentCollection {#12477 …}
    +favourites: Doctrine\ORM\PersistentCollection {#12479 …}
    +violations: Doctrine\ORM\PersistentCollection {#12481 …}
    +notifications: Doctrine\ORM\PersistentCollection {#12483 …}
    +awards: Doctrine\ORM\PersistentCollection {#12485 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#12487 …}
    +categories: Doctrine\ORM\PersistentCollection {#12489 …}
    -id: 1
    -password: "$2y$13$ZX7Aou2QOPRGkHPp4y5x8OWfxZMoT1BGH7bRLlPP7mwZFTkfiaPGG"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#12491 …}
    +apId: null
    +apProfileId: null
    +apPublicUrl: null
    +apFollowersUrl: null
    +apInboxUrl: null
    +apDomain: null
    +apPreferredUsername: null
    +apDiscoverable: null
    +apManuallyApprovesFollowers: null
    +privateKey: """
      -----BEGIN PRIVATE KEY-----\r\n
      MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDleeotz5TBiMlC\r\n
      YsJYJHVNxjvnvt0qsQA282B7vdqBTbARfD49iKPiMIwgU2yhCI0oTSQwc2Zy9AQ+\r\n
      31rwmvBx8VvcLgQvKpNzPVhMQjelK7k5iPiPc/W1soaauepq3YwQKgGod4c5Vh9f\r\n
      MInSANfOLOUSo3pUzfaQaGEvQc5DbKjDgIjsv/OKI1acbzu067KQzIThu+1BvcqQ\r\n
      Ypo2Ux5W23nNqkrRZ++z/r1MI2jS3vwi5OSwz4fWhLPJXE6lwokc6b/uAZe7sLT6\r\n
      QQtjevLnmMyRIVnmxbtHPMSfhLdz8ssQhoNCfAkMnBjDUX31SSs67pU8v5O3Fn2H\r\n
      d+qFWCjrREwSpBAd24INJqKsjSa6j3oLL8Xw8HZf+x6QRPJch/c3FNWRtM2b9n8V\r\n
      sAQiD985pafyeQ1TqIe4iSjI0iUgy2WgwO0C1Z0PNbQzQmRk0EOAlxIXjPmB229P\r\n
      V4+OcZxLT9phP/rid1Qt9Ro+2LdkS9Zqe8c2JHeJKc5Nv/8OOX5uQ/B82JXnuXYi\r\n
      /oVEJb5t42G8u3IIkYM5G/Gt033WU6dbyKOBmdnbXaPw9LC3M7oop3yyCb3UDLfg\r\n
      g/XnZVvZxSPCPlh5G1Lb0r47siKq/0k9YRua0AFsVg0dhqfuwsb6G9Hx5EicuPsu\r\n
      OIjXINBTjlnE4SdMz0ZJt7bLjwlKdQIDAQABAoICAAlWo8QHfYs+sMoF0Njbavam\r\n
      SYvNxZxWJacW0mdWu4ylh7O+dZ31cI3k4d7y5inLeksYkI90MsgczAtu9XlzJLPO\r\n
      WamlKcBtoCCBb5Vy4GbVV61SuKLF2krxn+6uAC8nIusJepXLf3JC4fXyuLkWFbIr\r\n
      O4s9od3Pn+gSh1nv+J/fzSJfmbLgwN1vQLgPAsQDD3o7CHFTP318ZsDnclUhnst0\r\n
      FQnckzzgWO3fQP7XNg3WyzX0UKYtW97L+bEJE55FQ2Us0gWyhOU7dLH2casztqzc\r\n
      F/8T91+fzlZAz9OaCAks6Tyb7L2I5KlhtNRF/bU8rAiy6tnVBgLeZG9d3upcQxX0\r\n
      L+SMPWg55qERGI5mO+BxFdUnVtcmswziKmySYtzgm+c4jmPS5cWhGB9HFCTW2S0x\r\n
      GoVA2cZGWjMTrbZQhgJjBqzp76fhLtXTufd328sYmX7fBYKEWFYNwrEJaWYUNl/V\r\n
      yEyl0aMQWKhVokx6eCqnuDZUc77LeuGuCleIdhQ53NYHrXMCmgVyLfmGdrOS3Uh6\r\n
      RrAYmnvvMkAUTOQajW2csC345PmgBOjE7vB7349ylKUkXvN4L+9xZCYaVjBt3O24\r\n
      aRoQSQDGhk+NIaYleiFx+u7dJSryxdx/6ut6dQ2S+jKlm1oN1qq6ppO5y/TFRQ1e\r\n
      qn7kjIGzUT80fANDFqdhAoIBAQD1+cGiWXRQhUrJc5X3ngH1zHoLWpmSZcUUDFn/\r\n
      bV/CChd2M43fOpneIQETZ1oS7BsU3y92kTw63ytYOUg7C5iT5/r9ZoBGq0HZSbll\r\n
      riRJWGiajr2aYCmIes++CrfUvCcD6+l8QMZ3s8eXdk80GX+vt1xEfRpWV9e9huJK\r\n
      K1e8wXfFmPAmxUi63IePscdc+SVQGeooMYDnMwLWvxpAtp5mGOaQc4D5dviWXjSE\r\n
      Z/PJa+gectpD1iDIPUXm3o17ivE2UYFia8/FCGUN6Yz7ucRKF+2SPO8hLefk5UvJ\r\n
      Lxlkh67MXKkneDqRU9C82Qmcfz5nQLQadC0nbE44YeXrnlIdAoIBAQDu1AWMIe6f\r\n
      7TZYCWnTa3nT6penJ9CMaGDPI/62dKTmGnI4oo3u9DGGrnuWbcFFCQA02vcYdpuw\r\n
      CVy6mkP/yqN5VSV3EHZiJUA0aKIxot3o3YOiobpVYn9hwvzzOdMZO4SOuevNfY1c\r\n
      qmnLGhYoDvR1c2yaudCf/BDwQqlLoSg9F5X57bRtwaRyUjhtXVKXWb59qtiwwrvp\r\n
      1vPjxciEIxAtgSXtIUQz3ljDRNUHjpyfYM3ska5jkxMIPNYUYFMX2x+Gxn9PZEG3\r\n
      Im391BRynZsnkvJO6i4i5N1xsPK5SyPiKBnlMxW/6ZLi5aAQHV3cc2KLzV+T+s2B\r\n
      v9LTAyO7nWo5AoIBAASA/jqqyKZwyl3F8AkIq6CEjfeHQSidFG65iyxSJF65MJTJ\r\n
      fN+Jgye+Evb3/X47NIO9UnEpV6D8VR7YbaonHDQZG09ogRDKMfp4jxx9g8yUAdZS\r\n
      psYc3KXTGdqw94y9pTk9KJlN1lR6xjzPvcOGdAATq2zVnZXXJewifCI/iOu73yWP\r\n
      F1aeZiaFwzWuW6goJ7a/wrnZrjKNjI/CEAj/TwcvjYk3lDT9KLAYKX4DKUOW5jko\r\n
      gTacxRzlglIn4Q9SC/iipWvX7YX+EVuf2yUA0cdJiOAUnYxN+uEGEc0tP5nHoju7\r\n
      tp0yZmAi2L+cecCT0+CwHpwdZHZEVWpS4JLf40ECggEBALFSZIgGDZlaU5YL7zHV\r\n
      Q5APRugKDLKjMPW7IPwxINnj2tioAL/hOQBpfkNTXEM4ipmz1fCo57FNUjcOINzD\r\n
      hJqqmHWNmIgIZmJDKeG2rhKenYTblXCeADwCvTKNxWmfoi0iZ6ybwqCBuqjcxoSZ\r\n
      jfHCcGl0+yw9yAnLRM1ta2XopCb70ZIIS2PCHjk9J/xN2ryNY/PhsgnN2ilMiTNq\r\n
      oTFYCWPF5lCojrj020KQJUPEaUBzbcpqwZ/FI6HfXvKAdCjqKk40/wHNI2Np2oC6\r\n
      +h7o4NWs0/J+gNhP6/edjZf19DwTsNtbvf6PRUeRtkXeudVY99T0Sy9B0HNxik9b\r\n
      cikCggEAM2wassiP1i0Gc3wrbNLHyQN+yqMaAp0xF+8l0fU3T8zPL/tYDcITnZPY\r\n
      pEFV/aodP9X7XFuQD0iGTOTGDXiMSLPOLI/ifmwbT41rgIN9x14MpU2EtWeVz7sx\r\n
      ZIFMt98rHx6BsZx/DnSFDQ8iqrKF3u+OOv7s6j+8odz4Rq53+16vMev5VUMOPq+E\r\n
      aQn8SDKkOjZzwb9QGB9bXS5s9yyj4pLyggQ0O5S2ugZjUcmCecNpktN8bUR3I9VQ\r\n
      KWkcQa9yCpidp/JYrQtlbqAPiIzptA4T4RNh+F6pKbmw7hNMIPipPzbQezEMaBOn\r\n
      Cgb38EldyAVGjCzRGfhu9SNU9B03bg==\r\n
      -----END PRIVATE KEY-----
      """
    +publicKey: """
      -----BEGIN PUBLIC KEY-----\r\n
      MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5XnqLc+UwYjJQmLCWCR1\r\n
      TcY7577dKrEANvNge73agU2wEXw+PYij4jCMIFNsoQiNKE0kMHNmcvQEPt9a8Jrw\r\n
      cfFb3C4ELyqTcz1YTEI3pSu5OYj4j3P1tbKGmrnqat2MECoBqHeHOVYfXzCJ0gDX\r\n
      zizlEqN6VM32kGhhL0HOQ2yow4CI7L/ziiNWnG87tOuykMyE4bvtQb3KkGKaNlMe\r\n
      Vtt5zapK0Wfvs/69TCNo0t78IuTksM+H1oSzyVxOpcKJHOm/7gGXu7C0+kELY3ry\r\n
      55jMkSFZ5sW7RzzEn4S3c/LLEIaDQnwJDJwYw1F99UkrOu6VPL+TtxZ9h3fqhVgo\r\n
      60RMEqQQHduCDSairI0muo96Cy/F8PB2X/sekETyXIf3NxTVkbTNm/Z/FbAEIg/f\r\n
      OaWn8nkNU6iHuIkoyNIlIMtloMDtAtWdDzW0M0JkZNBDgJcSF4z5gdtvT1ePjnGc\r\n
      S0/aYT/64ndULfUaPti3ZEvWanvHNiR3iSnOTb//Djl+bkPwfNiV57l2Iv6FRCW+\r\n
      beNhvLtyCJGDORvxrdN91lOnW8ijgZnZ212j8PSwtzO6KKd8sgm91Ay34IP152Vb\r\n
      2cUjwj5YeRtS29K+O7Iiqv9JPWEbmtABbFYNHYan7sLG+hvR8eRInLj7LjiI1yDQ\r\n
      U45ZxOEnTM9GSbe2y48JSnUCAwEAAQ==\r\n
      -----END PUBLIC KEY-----
      """
    +apFetchedAt: null
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1686560440 {#12438
      date: 2023-06-12 11:00:40.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +showAvatar: true
}
related_magazines App\Twig\Components\RelatedMagazinesComponent 14.0 MiB 23.99 ms
Input props
[
  "magazine" => "askelectronics@discuss.tchncs.de"
  "tag" => null
]
Attributes
[]
Component
App\Twig\Components\RelatedMagazinesComponent {#12599
  +limit: 4
  +tag: null
  +magazine: "askelectronics@discuss.tchncs.de"
  +type: "magazine"
  +title: "related_magazines"
  +refreshedRandom: false
  -repository: App\Repository\MagazineRepository {#334 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
active_users App\Twig\Components\ActiveUsersComponent 14.0 MiB 43.37 ms
Input props
[
  "magazine" => App\Entity\Magazine {#262
    +icon: Proxies\__CG__\App\Entity\Image {#242 …}
    +name: "askelectronics@discuss.tchncs.de"
    +title: "askelectronics"
    +description: """
      **For questions about component-level electronic circuits, tools and equipment.**\n
      \n
      Rules\n
      -----\n
      \n
      1: Be nice.\n
      \n
      2: Be on-topic (eg: *Electronic*, not *electrical*).\n
      \n
      3: No commercial stuff, buying, selling or valuations.\n
      \n
      4: Be safe.\n
      \n
      ---
      """
    +rules: null
    +subscriptionsCount: 1
    +entryCount: 154
    +entryCommentCount: 1230
    +postCount: 1
    +postCommentCount: 4
    +isAdult: false
    +customCss: null
    +lastActive: DateTime @1729413608 {#270
      date: 2024-10-20 10:40:08.0 +02:00
    }
    +markedForDeletionAt: null
    +tags: null
    +moderators: Doctrine\ORM\PersistentCollection {#233 …}
    +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
    +entries: Doctrine\ORM\PersistentCollection {#176 …}
    +posts: Doctrine\ORM\PersistentCollection {#134 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
    +bans: Doctrine\ORM\PersistentCollection {#113 …}
    +reports: Doctrine\ORM\PersistentCollection {#99 …}
    +badges: Doctrine\ORM\PersistentCollection {#77 …}
    +logs: Doctrine\ORM\PersistentCollection {#67 …}
    +awards: Doctrine\ORM\PersistentCollection {#2434 …}
    +categories: Doctrine\ORM\PersistentCollection {#1804 …}
    -id: 11
    +apId: "askelectronics@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
    +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
    +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "askelectronics"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: null
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1727247714 {#268
      date: 2024-09-25 09:01:54.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1687144409 {#276
      date: 2023-06-19 05:13:29.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\ActiveUsersComponent {#12725
  +magazine: App\Entity\Magazine {#262
    +icon: Proxies\__CG__\App\Entity\Image {#242 …}
    +name: "askelectronics@discuss.tchncs.de"
    +title: "askelectronics"
    +description: """
      **For questions about component-level electronic circuits, tools and equipment.**\n
      \n
      Rules\n
      -----\n
      \n
      1: Be nice.\n
      \n
      2: Be on-topic (eg: *Electronic*, not *electrical*).\n
      \n
      3: No commercial stuff, buying, selling or valuations.\n
      \n
      4: Be safe.\n
      \n
      ---
      """
    +rules: null
    +subscriptionsCount: 1
    +entryCount: 154
    +entryCommentCount: 1230
    +postCount: 1
    +postCommentCount: 4
    +isAdult: false
    +customCss: null
    +lastActive: DateTime @1729413608 {#270
      date: 2024-10-20 10:40:08.0 +02:00
    }
    +markedForDeletionAt: null
    +tags: null
    +moderators: Doctrine\ORM\PersistentCollection {#233 …}
    +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
    +entries: Doctrine\ORM\PersistentCollection {#176 …}
    +posts: Doctrine\ORM\PersistentCollection {#134 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
    +bans: Doctrine\ORM\PersistentCollection {#113 …}
    +reports: Doctrine\ORM\PersistentCollection {#99 …}
    +badges: Doctrine\ORM\PersistentCollection {#77 …}
    +logs: Doctrine\ORM\PersistentCollection {#67 …}
    +awards: Doctrine\ORM\PersistentCollection {#2434 …}
    +categories: Doctrine\ORM\PersistentCollection {#1804 …}
    -id: 11
    +apId: "askelectronics@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
    +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
    +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "askelectronics"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: null
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1727247714 {#268
      date: 2024-09-25 09:01:54.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1687144409 {#276
      date: 2023-06-19 05:13:29.0 +02:00
    }
  }
  -userRepository: App\Repository\UserRepository {#603 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 1.63 ms
Input props
[
  "user" => App\Entity\User {#12798
    +avatar: Proxies\__CG__\App\Entity\Image {#12797 …}
    +cover: Proxies\__CG__\App\Entity\Image {#12796 …}
    +email: "vfrmedia@social.tchncs.de"
    +username: "@vfrmedia@social.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: """
      Old roaming Tom Cat (zwerfkater) but still young at heart. Toots EN, (NL,FR,DE). [#DevOpa](https://social.tchncs.de/tags/DevOpa) - interested more in retro tech / culture / aesthetics than new stuff. Also transport and public infrastructure in general (with a UK/European focus)\n
      \n
      Welcome to the secret goose shed!\n
      \n
      Avatar is a tabby point Siamese cat - header picture is a Stentor FM radio transmitter designed in the Netherlands; popular with small pirate radio broadcasters in late 1980s
      """
    +lastActive: DateTime @1692636225 {#12801
      date: 2023-08-21 18:43:45.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: false
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: true
    +notifyOnNewEntryCommentReply: true
    +notifyOnNewPost: false
    +notifyOnNewPostReply: true
    +notifyOnNewPostCommentReply: true
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#12795 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#12793 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#12743 …}
    +entries: Doctrine\ORM\PersistentCollection {#12745 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#12752 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#12753 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#12755 …}
    +posts: Doctrine\ORM\PersistentCollection {#12757 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#12754 …}
    +postComments: Doctrine\ORM\PersistentCollection {#12747 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#12765 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#12762 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#12770 …}
    +follows: Doctrine\ORM\PersistentCollection {#12767 …}
    +followers: Doctrine\ORM\PersistentCollection {#12775 …}
    +blocks: Doctrine\ORM\PersistentCollection {#12777 …}
    +blockers: Doctrine\ORM\PersistentCollection {#12779 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#13187 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#13181 …}
    +reports: Doctrine\ORM\PersistentCollection {#12994 …}
    +favourites: Doctrine\ORM\PersistentCollection {#12983 …}
    +violations: Doctrine\ORM\PersistentCollection {#13189 …}
    +notifications: Doctrine\ORM\PersistentCollection {#13188 …}
    +awards: Doctrine\ORM\PersistentCollection {#13185 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#13182 …}
    +categories: Doctrine\ORM\PersistentCollection {#13179 …}
    -id: 41651
    -password: "$2y$13$MR/jvQLw20snj7dhCUOzrerIeJOUi.vmMEXqlAliA6M/KYuWQH.Sa"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#13178 …}
    +apId: "vfrmedia@social.tchncs.de"
    +apProfileId: "https://social.tchncs.de/users/vfrmedia"
    +apPublicUrl: "https://social.tchncs.de/@vfrmedia"
    +apFollowersUrl: "https://social.tchncs.de/users/vfrmedia/followers"
    +apInboxUrl: "https://social.tchncs.de/inbox"
    +apDomain: "social.tchncs.de"
    +apPreferredUsername: "vfrmedia"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1692636225 {#12800
      date: 2023-08-21 18:43:45.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1692554254 {#12799
      date: 2023-08-20 19:57:34.0 +02:00
    }
  }
  "width" => 65
  "height" => 65
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#12781
  +width: 65
  +height: 65
  +user: App\Entity\User {#12798
    +avatar: Proxies\__CG__\App\Entity\Image {#12797 …}
    +cover: Proxies\__CG__\App\Entity\Image {#12796 …}
    +email: "vfrmedia@social.tchncs.de"
    +username: "@vfrmedia@social.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: """
      Old roaming Tom Cat (zwerfkater) but still young at heart. Toots EN, (NL,FR,DE). [#DevOpa](https://social.tchncs.de/tags/DevOpa) - interested more in retro tech / culture / aesthetics than new stuff. Also transport and public infrastructure in general (with a UK/European focus)\n
      \n
      Welcome to the secret goose shed!\n
      \n
      Avatar is a tabby point Siamese cat - header picture is a Stentor FM radio transmitter designed in the Netherlands; popular with small pirate radio broadcasters in late 1980s
      """
    +lastActive: DateTime @1692636225 {#12801
      date: 2023-08-21 18:43:45.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: false
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: true
    +notifyOnNewEntryCommentReply: true
    +notifyOnNewPost: false
    +notifyOnNewPostReply: true
    +notifyOnNewPostCommentReply: true
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#12795 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#12793 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#12743 …}
    +entries: Doctrine\ORM\PersistentCollection {#12745 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#12752 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#12753 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#12755 …}
    +posts: Doctrine\ORM\PersistentCollection {#12757 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#12754 …}
    +postComments: Doctrine\ORM\PersistentCollection {#12747 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#12765 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#12762 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#12770 …}
    +follows: Doctrine\ORM\PersistentCollection {#12767 …}
    +followers: Doctrine\ORM\PersistentCollection {#12775 …}
    +blocks: Doctrine\ORM\PersistentCollection {#12777 …}
    +blockers: Doctrine\ORM\PersistentCollection {#12779 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#13187 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#13181 …}
    +reports: Doctrine\ORM\PersistentCollection {#12994 …}
    +favourites: Doctrine\ORM\PersistentCollection {#12983 …}
    +violations: Doctrine\ORM\PersistentCollection {#13189 …}
    +notifications: Doctrine\ORM\PersistentCollection {#13188 …}
    +awards: Doctrine\ORM\PersistentCollection {#13185 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#13182 …}
    +categories: Doctrine\ORM\PersistentCollection {#13179 …}
    -id: 41651
    -password: "$2y$13$MR/jvQLw20snj7dhCUOzrerIeJOUi.vmMEXqlAliA6M/KYuWQH.Sa"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#13178 …}
    +apId: "vfrmedia@social.tchncs.de"
    +apProfileId: "https://social.tchncs.de/users/vfrmedia"
    +apPublicUrl: "https://social.tchncs.de/@vfrmedia"
    +apFollowersUrl: "https://social.tchncs.de/users/vfrmedia/followers"
    +apInboxUrl: "https://social.tchncs.de/inbox"
    +apDomain: "social.tchncs.de"
    +apPreferredUsername: "vfrmedia"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1692636225 {#12800
      date: 2023-08-21 18:43:45.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1692554254 {#12799
      date: 2023-08-20 19:57:34.0 +02:00
    }
  }
  +asLink: true
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 7.42 ms
Input props
[
  "user" => App\Entity\User {#12916
    +avatar: Proxies\__CG__\App\Entity\Image {#12915 …}
    +cover: null
    +email: "birdcat@lemmy.ml"
    +username: "@birdcat@lemmy.ml"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: """
      Appreciate and upvote every reply to my comments/posts if I can detect any effort being put into it; even if I think you completely missed what I tried to say or strongly disagree with your opinion.\n
      \n
      Occasionally I cannot resist shitposting, hyperbolic, ironic, sarcastic or populist rhetoric; no /s
      """
    +lastActive: DateTime @1696696022 {#12919
      date: 2023-10-07 18:27:02.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#12914 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#12912 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#12910 …}
    +entries: Doctrine\ORM\PersistentCollection {#12908 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#12906 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#12904 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#12902 …}
    +posts: Doctrine\ORM\PersistentCollection {#12900 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#12898 …}
    +postComments: Doctrine\ORM\PersistentCollection {#12896 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#12894 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#12892 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#12890 …}
    +follows: Doctrine\ORM\PersistentCollection {#12888 …}
    +followers: Doctrine\ORM\PersistentCollection {#12886 …}
    +blocks: Doctrine\ORM\PersistentCollection {#12884 …}
    +blockers: Doctrine\ORM\PersistentCollection {#12882 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#12880 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#12878 …}
    +reports: Doctrine\ORM\PersistentCollection {#12876 …}
    +favourites: Doctrine\ORM\PersistentCollection {#12874 …}
    +violations: Doctrine\ORM\PersistentCollection {#12872 …}
    +notifications: Doctrine\ORM\PersistentCollection {#12870 …}
    +awards: Doctrine\ORM\PersistentCollection {#12868 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#12866 …}
    +categories: Doctrine\ORM\PersistentCollection {#12864 …}
    -id: 21796
    -password: "$2y$13$ACNmoGKWwRgm/Njn146GG.b25O8.XXYtlu6ZukGNMl7KWiROcYuzK"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#12862 …}
    +apId: "birdcat@lemmy.ml"
    +apProfileId: "https://lemmy.ml/u/birdcat"
    +apPublicUrl: "https://lemmy.ml/u/birdcat"
    +apFollowersUrl: null
    +apInboxUrl: "https://lemmy.ml/inbox"
    +apDomain: "lemmy.ml"
    +apPreferredUsername: "birdcat"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1719824521 {#12918
      date: 2024-07-01 11:02:01.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689039812 {#12917
      date: 2023-07-11 03:43:32.0 +02:00
    }
  }
  "width" => 65
  "height" => 65
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#13055
  +width: 65
  +height: 65
  +user: App\Entity\User {#12916
    +avatar: Proxies\__CG__\App\Entity\Image {#12915 …}
    +cover: null
    +email: "birdcat@lemmy.ml"
    +username: "@birdcat@lemmy.ml"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: """
      Appreciate and upvote every reply to my comments/posts if I can detect any effort being put into it; even if I think you completely missed what I tried to say or strongly disagree with your opinion.\n
      \n
      Occasionally I cannot resist shitposting, hyperbolic, ironic, sarcastic or populist rhetoric; no /s
      """
    +lastActive: DateTime @1696696022 {#12919
      date: 2023-10-07 18:27:02.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#12914 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#12912 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#12910 …}
    +entries: Doctrine\ORM\PersistentCollection {#12908 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#12906 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#12904 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#12902 …}
    +posts: Doctrine\ORM\PersistentCollection {#12900 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#12898 …}
    +postComments: Doctrine\ORM\PersistentCollection {#12896 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#12894 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#12892 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#12890 …}
    +follows: Doctrine\ORM\PersistentCollection {#12888 …}
    +followers: Doctrine\ORM\PersistentCollection {#12886 …}
    +blocks: Doctrine\ORM\PersistentCollection {#12884 …}
    +blockers: Doctrine\ORM\PersistentCollection {#12882 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#12880 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#12878 …}
    +reports: Doctrine\ORM\PersistentCollection {#12876 …}
    +favourites: Doctrine\ORM\PersistentCollection {#12874 …}
    +violations: Doctrine\ORM\PersistentCollection {#12872 …}
    +notifications: Doctrine\ORM\PersistentCollection {#12870 …}
    +awards: Doctrine\ORM\PersistentCollection {#12868 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#12866 …}
    +categories: Doctrine\ORM\PersistentCollection {#12864 …}
    -id: 21796
    -password: "$2y$13$ACNmoGKWwRgm/Njn146GG.b25O8.XXYtlu6ZukGNMl7KWiROcYuzK"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#12862 …}
    +apId: "birdcat@lemmy.ml"
    +apProfileId: "https://lemmy.ml/u/birdcat"
    +apPublicUrl: "https://lemmy.ml/u/birdcat"
    +apFollowersUrl: null
    +apInboxUrl: "https://lemmy.ml/inbox"
    +apDomain: "lemmy.ml"
    +apPreferredUsername: "birdcat"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1719824521 {#12918
      date: 2024-07-01 11:02:01.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689039812 {#12917
      date: 2023-07-11 03:43:32.0 +02:00
    }
  }
  +asLink: true
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 12.50 ms
Input props
[
  "user" => App\Entity\User {#12857
    +avatar: Proxies\__CG__\App\Entity\Image {#12856 …}
    +cover: null
    +email: "skillissuer@discuss.tchncs.de"
    +username: "@skillissuer@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: "i should be writing"
    +lastActive: DateTime @1721044672 {#12860
      date: 2024-07-15 13:57:52.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: false
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: true
    +notifyOnNewEntryCommentReply: true
    +notifyOnNewPost: false
    +notifyOnNewPostReply: true
    +notifyOnNewPostCommentReply: true
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#12855 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#12853 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#12851 …}
    +entries: Doctrine\ORM\PersistentCollection {#12849 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#12847 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#12845 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#12843 …}
    +posts: Doctrine\ORM\PersistentCollection {#12841 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#12839 …}
    +postComments: Doctrine\ORM\PersistentCollection {#12837 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#12835 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#12833 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#12831 …}
    +follows: Doctrine\ORM\PersistentCollection {#12829 …}
    +followers: Doctrine\ORM\PersistentCollection {#12827 …}
    +blocks: Doctrine\ORM\PersistentCollection {#12825 …}
    +blockers: Doctrine\ORM\PersistentCollection {#12823 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#12821 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#12819 …}
    +reports: Doctrine\ORM\PersistentCollection {#12817 …}
    +favourites: Doctrine\ORM\PersistentCollection {#12815 …}
    +violations: Doctrine\ORM\PersistentCollection {#12813 …}
    +notifications: Doctrine\ORM\PersistentCollection {#12811 …}
    +awards: Doctrine\ORM\PersistentCollection {#12809 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#12807 …}
    +categories: Doctrine\ORM\PersistentCollection {#12805 …}
    -id: 39464
    -password: "$2y$13$wQAP4Gif3ESopfZf00xAU.zwr9iTTX.ev3twB9omsse0v00sxuD/G"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#12803 …}
    +apId: "skillissuer@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/skillissuer"
    +apPublicUrl: "https://discuss.tchncs.de/u/skillissuer"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "skillissuer"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728245617 {#12859
      date: 2024-10-06 22:13:37.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1691480767 {#12858
      date: 2023-08-08 09:46:07.0 +02:00
    }
  }
  "width" => 65
  "height" => 65
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#12990
  +width: 65
  +height: 65
  +user: App\Entity\User {#12857
    +avatar: Proxies\__CG__\App\Entity\Image {#12856 …}
    +cover: null
    +email: "skillissuer@discuss.tchncs.de"
    +username: "@skillissuer@discuss.tchncs.de"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: "i should be writing"
    +lastActive: DateTime @1721044672 {#12860
      date: 2024-07-15 13:57:52.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: false
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: true
    +notifyOnNewEntryCommentReply: true
    +notifyOnNewPost: false
    +notifyOnNewPostReply: true
    +notifyOnNewPostCommentReply: true
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#12855 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#12853 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#12851 …}
    +entries: Doctrine\ORM\PersistentCollection {#12849 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#12847 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#12845 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#12843 …}
    +posts: Doctrine\ORM\PersistentCollection {#12841 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#12839 …}
    +postComments: Doctrine\ORM\PersistentCollection {#12837 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#12835 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#12833 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#12831 …}
    +follows: Doctrine\ORM\PersistentCollection {#12829 …}
    +followers: Doctrine\ORM\PersistentCollection {#12827 …}
    +blocks: Doctrine\ORM\PersistentCollection {#12825 …}
    +blockers: Doctrine\ORM\PersistentCollection {#12823 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#12821 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#12819 …}
    +reports: Doctrine\ORM\PersistentCollection {#12817 …}
    +favourites: Doctrine\ORM\PersistentCollection {#12815 …}
    +violations: Doctrine\ORM\PersistentCollection {#12813 …}
    +notifications: Doctrine\ORM\PersistentCollection {#12811 …}
    +awards: Doctrine\ORM\PersistentCollection {#12809 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#12807 …}
    +categories: Doctrine\ORM\PersistentCollection {#12805 …}
    -id: 39464
    -password: "$2y$13$wQAP4Gif3ESopfZf00xAU.zwr9iTTX.ev3twB9omsse0v00sxuD/G"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#12803 …}
    +apId: "skillissuer@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/u/skillissuer"
    +apPublicUrl: "https://discuss.tchncs.de/u/skillissuer"
    +apFollowersUrl: null
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "skillissuer"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1728245617 {#12859
      date: 2024-10-06 22:13:37.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1691480767 {#12858
      date: 2023-08-08 09:46:07.0 +02:00
    }
  }
  +asLink: true
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 0.37 ms
Input props
[
  "user" => App\Entity\User {#13172
    +avatar: Proxies\__CG__\App\Entity\Image {#13169 …}
    +cover: Proxies\__CG__\App\Entity\Image {#13170 …}
    +email: "TCB13@lemmy.world"
    +username: "@TCB13@lemmy.world"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: ""
    +lastActive: DateTime @1729518803 {#12992
      date: 2024-10-21 15:53:23.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: false
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: true
    +notifyOnNewEntryCommentReply: true
    +notifyOnNewPost: false
    +notifyOnNewPostReply: true
    +notifyOnNewPostCommentReply: true
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#13167 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#13165 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#13163 …}
    +entries: Doctrine\ORM\PersistentCollection {#13161 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#13159 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#13157 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#13155 …}
    +posts: Doctrine\ORM\PersistentCollection {#13153 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#13151 …}
    +postComments: Doctrine\ORM\PersistentCollection {#13149 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#13147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#13145 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#13143 …}
    +follows: Doctrine\ORM\PersistentCollection {#13141 …}
    +followers: Doctrine\ORM\PersistentCollection {#13139 …}
    +blocks: Doctrine\ORM\PersistentCollection {#13137 …}
    +blockers: Doctrine\ORM\PersistentCollection {#13135 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#13133 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#13131 …}
    +reports: Doctrine\ORM\PersistentCollection {#13129 …}
    +favourites: Doctrine\ORM\PersistentCollection {#13127 …}
    +violations: Doctrine\ORM\PersistentCollection {#13125 …}
    +notifications: Doctrine\ORM\PersistentCollection {#13123 …}
    +awards: Doctrine\ORM\PersistentCollection {#13121 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#13119 …}
    +categories: Doctrine\ORM\PersistentCollection {#13117 …}
    -id: 43677
    -password: "$2y$13$67WvGuLt4FPbc4trvxnH0ODZHTvTlMWI7kaafAJZUzYiSsXw.KDqi"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#13115 …}
    +apId: "TCB13@lemmy.world"
    +apProfileId: "https://lemmy.world/u/TCB13"
    +apPublicUrl: "https://lemmy.world/u/TCB13"
    +apFollowersUrl: null
    +apInboxUrl: "https://lemmy.world/inbox"
    +apDomain: "lemmy.world"
    +apPreferredUsername: "TCB13"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1729566764 {#13173
      date: 2024-10-22 05:12:44.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1693492241 {#13171
      date: 2023-08-31 16:30:41.0 +02:00
    }
  }
  "width" => 65
  "height" => 65
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#13250
  +width: 65
  +height: 65
  +user: App\Entity\User {#13172
    +avatar: Proxies\__CG__\App\Entity\Image {#13169 …}
    +cover: Proxies\__CG__\App\Entity\Image {#13170 …}
    +email: "TCB13@lemmy.world"
    +username: "@TCB13@lemmy.world"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: ""
    +lastActive: DateTime @1729518803 {#12992
      date: 2024-10-21 15:53:23.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: false
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: true
    +notifyOnNewEntryCommentReply: true
    +notifyOnNewPost: false
    +notifyOnNewPostReply: true
    +notifyOnNewPostCommentReply: true
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#13167 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#13165 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#13163 …}
    +entries: Doctrine\ORM\PersistentCollection {#13161 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#13159 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#13157 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#13155 …}
    +posts: Doctrine\ORM\PersistentCollection {#13153 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#13151 …}
    +postComments: Doctrine\ORM\PersistentCollection {#13149 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#13147 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#13145 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#13143 …}
    +follows: Doctrine\ORM\PersistentCollection {#13141 …}
    +followers: Doctrine\ORM\PersistentCollection {#13139 …}
    +blocks: Doctrine\ORM\PersistentCollection {#13137 …}
    +blockers: Doctrine\ORM\PersistentCollection {#13135 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#13133 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#13131 …}
    +reports: Doctrine\ORM\PersistentCollection {#13129 …}
    +favourites: Doctrine\ORM\PersistentCollection {#13127 …}
    +violations: Doctrine\ORM\PersistentCollection {#13125 …}
    +notifications: Doctrine\ORM\PersistentCollection {#13123 …}
    +awards: Doctrine\ORM\PersistentCollection {#13121 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#13119 …}
    +categories: Doctrine\ORM\PersistentCollection {#13117 …}
    -id: 43677
    -password: "$2y$13$67WvGuLt4FPbc4trvxnH0ODZHTvTlMWI7kaafAJZUzYiSsXw.KDqi"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#13115 …}
    +apId: "TCB13@lemmy.world"
    +apProfileId: "https://lemmy.world/u/TCB13"
    +apPublicUrl: "https://lemmy.world/u/TCB13"
    +apFollowersUrl: null
    +apInboxUrl: "https://lemmy.world/inbox"
    +apDomain: "lemmy.world"
    +apPreferredUsername: "TCB13"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1729566764 {#13173
      date: 2024-10-22 05:12:44.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1693492241 {#13171
      date: 2023-08-31 16:30:41.0 +02:00
    }
  }
  +asLink: true
}
user_avatar App\Twig\Components\UserAvatarComponent 14.0 MiB 0.31 ms
Input props
[
  "user" => App\Entity\User {#12975
    +avatar: Proxies\__CG__\App\Entity\Image {#12974 …}
    +cover: null
    +email: "jarrodsfarrell@hoosier.social"
    +username: "@jarrodsfarrell@hoosier.social"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: """
      Grounded tech enthusiast, Linux enjoyer, and Indy 500 wannabe that lives in south-east Indiana.  \n
      Go pride. [#LGBTQ](https://hoosier.social/tags/LGBTQ)
      """
    +lastActive: DateTime @1690728142 {#12978
      date: 2023-07-30 16:42:22.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#12973 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#12971 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#12969 …}
    +entries: Doctrine\ORM\PersistentCollection {#12967 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#12965 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#12963 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#12961 …}
    +posts: Doctrine\ORM\PersistentCollection {#12959 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#12957 …}
    +postComments: Doctrine\ORM\PersistentCollection {#12955 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#12953 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#12951 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#12949 …}
    +follows: Doctrine\ORM\PersistentCollection {#12947 …}
    +followers: Doctrine\ORM\PersistentCollection {#12945 …}
    +blocks: Doctrine\ORM\PersistentCollection {#12943 …}
    +blockers: Doctrine\ORM\PersistentCollection {#12941 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#12939 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#12937 …}
    +reports: Doctrine\ORM\PersistentCollection {#12935 …}
    +favourites: Doctrine\ORM\PersistentCollection {#12933 …}
    +violations: Doctrine\ORM\PersistentCollection {#12931 …}
    +notifications: Doctrine\ORM\PersistentCollection {#12929 …}
    +awards: Doctrine\ORM\PersistentCollection {#12927 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#12925 …}
    +categories: Doctrine\ORM\PersistentCollection {#12923 …}
    -id: 20657
    -password: "$2y$13$XNERcrvg1/EZkZQbKQ6R6efd5bjo3rlAJRSz0lDRnfkNCV76hr5Me"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#12921 …}
    +apId: "jarrodsfarrell@hoosier.social"
    +apProfileId: "https://hoosier.social/users/jarrodsfarrell"
    +apPublicUrl: "https://hoosier.social/@jarrodsfarrell"
    +apFollowersUrl: "https://hoosier.social/users/jarrodsfarrell/followers"
    +apInboxUrl: "https://hoosier.social/inbox"
    +apDomain: "hoosier.social"
    +apPreferredUsername: "jarrodsfarrell"
    +apDiscoverable: false
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1690726862 {#12977
      date: 2023-07-30 16:21:02.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1688878027 {#12976
      date: 2023-07-09 06:47:07.0 +02:00
    }
  }
  "width" => 65
  "height" => 65
  "asLink" => true
]
Attributes
[]
Component
App\Twig\Components\UserAvatarComponent {#13307
  +width: 65
  +height: 65
  +user: App\Entity\User {#12975
    +avatar: Proxies\__CG__\App\Entity\Image {#12974 …}
    +cover: null
    +email: "jarrodsfarrell@hoosier.social"
    +username: "@jarrodsfarrell@hoosier.social"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: """
      Grounded tech enthusiast, Linux enjoyer, and Indy 500 wannabe that lives in south-east Indiana.  \n
      Go pride. [#LGBTQ](https://hoosier.social/tags/LGBTQ)
      """
    +lastActive: DateTime @1690728142 {#12978
      date: 2023-07-30 16:42:22.0 +02:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#12973 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#12971 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#12969 …}
    +entries: Doctrine\ORM\PersistentCollection {#12967 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#12965 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#12963 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#12961 …}
    +posts: Doctrine\ORM\PersistentCollection {#12959 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#12957 …}
    +postComments: Doctrine\ORM\PersistentCollection {#12955 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#12953 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#12951 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#12949 …}
    +follows: Doctrine\ORM\PersistentCollection {#12947 …}
    +followers: Doctrine\ORM\PersistentCollection {#12945 …}
    +blocks: Doctrine\ORM\PersistentCollection {#12943 …}
    +blockers: Doctrine\ORM\PersistentCollection {#12941 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#12939 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#12937 …}
    +reports: Doctrine\ORM\PersistentCollection {#12935 …}
    +favourites: Doctrine\ORM\PersistentCollection {#12933 …}
    +violations: Doctrine\ORM\PersistentCollection {#12931 …}
    +notifications: Doctrine\ORM\PersistentCollection {#12929 …}
    +awards: Doctrine\ORM\PersistentCollection {#12927 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#12925 …}
    +categories: Doctrine\ORM\PersistentCollection {#12923 …}
    -id: 20657
    -password: "$2y$13$XNERcrvg1/EZkZQbKQ6R6efd5bjo3rlAJRSz0lDRnfkNCV76hr5Me"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#12921 …}
    +apId: "jarrodsfarrell@hoosier.social"
    +apProfileId: "https://hoosier.social/users/jarrodsfarrell"
    +apPublicUrl: "https://hoosier.social/@jarrodsfarrell"
    +apFollowersUrl: "https://hoosier.social/users/jarrodsfarrell/followers"
    +apInboxUrl: "https://hoosier.social/inbox"
    +apDomain: "hoosier.social"
    +apPreferredUsername: "jarrodsfarrell"
    +apDiscoverable: false
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1690726862 {#12977
      date: 2023-07-30 16:21:02.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1688878027 {#12976
      date: 2023-07-09 06:47:07.0 +02:00
    }
  }
  +asLink: true
}
related_categories App\Twig\Components\RelatedCategoriesComponent 14.0 MiB 3.05 ms
Input props
[
  "magazine" => "askelectronics@discuss.tchncs.de"
  "tag" => null
]
Attributes
[]
Component
App\Twig\Components\RelatedCategoriesComponent {#13369
  +limit: 4
  +tag: null
  +magazine: "askelectronics@discuss.tchncs.de"
  +type: "related"
  +title: "related_categories"
  +refreshedRandom: false
  -repository: App\Repository\CategoryRepository {#13370 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
related_posts App\Twig\Components\RelatedPostsComponent 14.0 MiB 4.61 ms
Input props
[
  "magazine" => "askelectronics@discuss.tchncs.de"
  "tag" => null
]
Attributes
[]
Component
App\Twig\Components\RelatedPostsComponent {#13446
  +limit: 4
  +tag: null
  +magazine: "askelectronics@discuss.tchncs.de"
  +type: "magazine"
  +post: null
  +title: "related_posts"
  +refreshedRandom: false
  -repository: App\Repository\PostRepository {#13447 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -mentionManager: App\Service\MentionManager {#390 …}
}
related_entries App\Twig\Components\RelatedEntriesComponent 14.0 MiB 15.97 ms
Input props
[
  "magazine" => "askelectronics@discuss.tchncs.de"
  "tag" => null
]
Attributes
[]
Component
App\Twig\Components\RelatedEntriesComponent {#13567
  +limit: 4
  +tag: null
  +magazine: "askelectronics@discuss.tchncs.de"
  +type: "magazine"
  +entry: null
  +title: "related_entries"
  +refreshedRandom: false
  -repository: App\Repository\EntryRepository {#335 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -mentionManager: App\Service\MentionManager {#390 …}
}
support_us_block App\Twig\Components\SupportUsBlock 14.0 MiB 0.55 ms
Input props
[]
Attributes
[]
Component
App\Twig\Components\SupportUsBlock {#13622
  +subject: ? App\Entity\Contracts\VotableInterface
  +url: ? string
  -twig: Twig\Environment {#1252 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -partnerBlockRepository: App\Repository\PartnerBlockRepository {#13621 …}
}
featured_magazines App\Twig\Components\FeaturedMagazinesComponent 14.0 MiB 0.76 ms
Input props
[
  "magazine" => App\Entity\Magazine {#262
    +icon: Proxies\__CG__\App\Entity\Image {#242 …}
    +name: "askelectronics@discuss.tchncs.de"
    +title: "askelectronics"
    +description: """
      **For questions about component-level electronic circuits, tools and equipment.**\n
      \n
      Rules\n
      -----\n
      \n
      1: Be nice.\n
      \n
      2: Be on-topic (eg: *Electronic*, not *electrical*).\n
      \n
      3: No commercial stuff, buying, selling or valuations.\n
      \n
      4: Be safe.\n
      \n
      ---
      """
    +rules: null
    +subscriptionsCount: 1
    +entryCount: 154
    +entryCommentCount: 1230
    +postCount: 1
    +postCommentCount: 4
    +isAdult: false
    +customCss: null
    +lastActive: DateTime @1729413608 {#270
      date: 2024-10-20 10:40:08.0 +02:00
    }
    +markedForDeletionAt: null
    +tags: null
    +moderators: Doctrine\ORM\PersistentCollection {#233 …}
    +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
    +entries: Doctrine\ORM\PersistentCollection {#176 …}
    +posts: Doctrine\ORM\PersistentCollection {#134 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
    +bans: Doctrine\ORM\PersistentCollection {#113 …}
    +reports: Doctrine\ORM\PersistentCollection {#99 …}
    +badges: Doctrine\ORM\PersistentCollection {#77 …}
    +logs: Doctrine\ORM\PersistentCollection {#67 …}
    +awards: Doctrine\ORM\PersistentCollection {#2434 …}
    +categories: Doctrine\ORM\PersistentCollection {#1804 …}
    -id: 11
    +apId: "askelectronics@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
    +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
    +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "askelectronics"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: null
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1727247714 {#268
      date: 2024-09-25 09:01:54.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1687144409 {#276
      date: 2023-06-19 05:13:29.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\FeaturedMagazinesComponent {#13697
  +magazine: App\Entity\Magazine {#262
    +icon: Proxies\__CG__\App\Entity\Image {#242 …}
    +name: "askelectronics@discuss.tchncs.de"
    +title: "askelectronics"
    +description: """
      **For questions about component-level electronic circuits, tools and equipment.**\n
      \n
      Rules\n
      -----\n
      \n
      1: Be nice.\n
      \n
      2: Be on-topic (eg: *Electronic*, not *electrical*).\n
      \n
      3: No commercial stuff, buying, selling or valuations.\n
      \n
      4: Be safe.\n
      \n
      ---
      """
    +rules: null
    +subscriptionsCount: 1
    +entryCount: 154
    +entryCommentCount: 1230
    +postCount: 1
    +postCommentCount: 4
    +isAdult: false
    +customCss: null
    +lastActive: DateTime @1729413608 {#270
      date: 2024-10-20 10:40:08.0 +02:00
    }
    +markedForDeletionAt: null
    +tags: null
    +moderators: Doctrine\ORM\PersistentCollection {#233 …}
    +ownershipRequests: Doctrine\ORM\PersistentCollection {#229 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#218 …}
    +entries: Doctrine\ORM\PersistentCollection {#176 …}
    +posts: Doctrine\ORM\PersistentCollection {#134 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#196 …}
    +bans: Doctrine\ORM\PersistentCollection {#113 …}
    +reports: Doctrine\ORM\PersistentCollection {#99 …}
    +badges: Doctrine\ORM\PersistentCollection {#77 …}
    +logs: Doctrine\ORM\PersistentCollection {#67 …}
    +awards: Doctrine\ORM\PersistentCollection {#2434 …}
    +categories: Doctrine\ORM\PersistentCollection {#1804 …}
    -id: 11
    +apId: "askelectronics@discuss.tchncs.de"
    +apProfileId: "https://discuss.tchncs.de/c/askelectronics"
    +apPublicUrl: "https://discuss.tchncs.de/c/askelectronics"
    +apFollowersUrl: "https://discuss.tchncs.de/c/askelectronics/followers"
    +apInboxUrl: "https://discuss.tchncs.de/inbox"
    +apDomain: "discuss.tchncs.de"
    +apPreferredUsername: "askelectronics"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: null
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1727247714 {#268
      date: 2024-09-25 09:01:54.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1687144409 {#276
      date: 2023-06-19 05:13:29.0 +02:00
    }
  }
  -twig: Twig\Environment {#1252 …}
  -repository: App\Repository\MagazineRepository {#334 …}
}