Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Go言語によるROSプログラミング
Search
akio
September 14, 2018
Technology
0
520
Go言語によるROSプログラミング
Slides used in my talk about ROS client library implementation for ROS.
akio
September 14, 2018
Tweet
Share
More Decks by akio
See All by akio
2016-06-26 第8回ROS勉強会LT資料 catkin-tools
akio
0
390
2016-06-26 第8回ROS勉強会資料 ROSCRAFT
akio
0
480
第1回ROS勉強会発表資料 ROS+Gazeboではじめるロボットシミュレーション
akio
0
720
Other Decks in Technology
See All in Technology
帳票Vibe Coding
terurou
0
130
プロジェクトマネジメントは不確実性との対話だ
hisashiwatanabe
0
200
[CV勉強会@関東 CVPR2025 読み会] MegaSaM: Accurate, Fast, and Robust Structure and Motion from Casual Dynamic Videos (Li+, CVPR2025)
abemii
0
180
つくって納得、つかって実感! 大規模言語モデルことはじめ
recruitengineers
PRO
9
1.9k
信頼できる開発プラットフォームをどう作るか?-Governance as Codeと継続的監視/フィードバックが導くPlatform Engineeringの進め方
yuriemori
1
430
株式会社ARAV 採用案内
maqui
0
290
ABEMAにおける 生成AI活用の現在地 / The Current Status of Generative AI at ABEMA
dekatotoro
0
630
ウォンテッドリーのアラート設計と Datadog 移行での知見
donkomura
0
300
マイクロモビリティシェアサービスを支える プラットフォームアーキテクチャ
grimoh
1
190
S3のライフサイクル設計でハマったポイント
mkumada
0
140
そのコンポーネント、サーバー?クライアント?App Router開発のモヤモヤを可視化する補助輪
makotot
3
260
mruby(PicoRuby)で ファミコン音楽を奏でる
kishima
1
140
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.4k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
1k
The Pragmatic Product Professional
lauravandoore
36
6.8k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
BBQ
matthewcrist
89
9.8k
Designing for humans not robots
tammielis
253
25k
Building Adaptive Systems
keathley
43
2.7k
Documentation Writing (for coders)
carmenintech
73
5k
The Art of Programming - Codeland 2020
erikaheidi
55
13k
[RailsConf 2023] Rails as a piece of cake
palkan
56
5.8k
Transcript
GoݴޠʹΑΔROSϓϩάϥϛϯά https://github.com/akio/rosgo.git
ࣗݾհ
ࣗݾհ • Akiyoshi(Akio) Ochiai • Sr Engineer @ Toyota Research
Institute • ϞόΠϧϚχϐϡϨʔγϣϯϩϘοτͷݚڀ։ൃʹैࣄ • GitHub: http://github.com/akio • ࠓݸਓతͳOSS׆ಈͷΛ͠·͢
ROSؔͰ࡞ͬͨͷ • rosrb • ROSͷRubyΫϥΠΞϯτϥΠϒϥϦ • ࣌ಉ͡ձࣾʹ͍ͨ@OTLࢯͱ͔Ϳ্ͬͨʹग़ΕͯϘπ • vim-ctrlp-ros •
Vim Ctrl-P ROS ϓϥάΠϯ • msg/srv/actionͳͲΛVim͔ΒΠϯΫϦϝϯλϧαʔν • RosCraft • MinecraftΛROS͔Β੍ޚͰ͖Δͧ • Կ͕͔ͨͬͨ͠ͷ͔Α͘Θ͔Βͳ͍ • fluent_logger_ros • ROSͷϩάΛfluentdʹྲྀ͠ࠐΉখ • mask_rcnn_ros • Advent CalendarͷωλͷͨΊʹ։ൃ • menoh_ros • ONNXΛROSͷը૾ॲཧύΠϓϥΠϯʹυϩοϓΠϯ • rosgo • ࠓճൃද͢Δ༰ • ͦͷଞ׆ಈ • MoveIt! ͷPRɺϝϯςφʔձٞࢀՃͳͲ • ROSίΞύοέʔδͷPRͳͲ
ެ։ROS͓ࣄ • ։ൃνʔϜͷڠྗͷͱɺτϤλHSRͷϩϘοτϞσϧϑΝΠϧΛΦʔϓϯιʔεԽ͠·ͨ͠ • hsr_description • https://github.com/ToyotaResearchInstitute/hsr_description • hsr_meshes •
https://github.com/ToyotaResearchInstitute/hsr_meshes https://github.com/OTL/gear ROSҎ֎Ͱͷ׆༻ྫ
Why Go?
ಈػ • 2013࣌ɺROS։ൃਓࡐͷҭʹΜͰ͍ͨ • C++ • ෳࡶͳݴޠ༷ • Python/MatlabͳͲ͔Βདྷͨਓͷϋʔυϧ͕ߴ͍ •
Cݴޠܦݧऀ͕৽֓೦ΛֶͿͷ͍͠ʢOOPɺδΣωϦοΫϓϩάϥϛϯάʣ • Python • ֶशίετ͍ • ੑೳ͕ඞཁʹͳΔͱ݁ہC/C++/CythonͳͲΛॻ͔͟Δ͑ͳ͘ͳͬͨΓ͢Δ
͍֮͑͢ ͍ͦͦ͜͜ ͋ΔఔϦΞϧλΠϜੑͷ͋Δ ϓϩάϥϛϯάݴޠͳ͍͔ʁ
̎̌̍̏࣌ͷީิൺֱ • Java • rosjava͕͢Ͱʹଘࡏ • ωΠςΟϒίϯύΠϧͰ͖ͳ͍ • ύοέʔδ͕ͭΒ͍ •
Go • Better C తͳจ๏ • ػೳ͕ߜΒΕ֮͑Δ͜ͱ͕গͳ͍ • ωΠςΟϒίϯύΠϧͰ݁ߏ͍ • GC͕ϝϞϦͷੈΛͯ͘͠ΕΔ • Rust • ͍ɺ҆શɺؾ͍͍࣋ͪ • ͕ࣗٻΊ͍ͯͨͷ͕େମ͋Δ • ͋Γ͗ͯͬ͢ͺΓֶशίετ͕ߴ ͍ͷͰ‥.ʁ • Julia • ॻ͖ͯͯ͘͘͢࠷ڧʹݟ͑Δ • Ͱ࣌Ͱ͖͔ͨΓͰ৭ʑػೳ͕ Γͳ͔ͬͨ • ฒྻॲཧ͕ͭΒͦ͏
ͦͷଞͷڧΈ • ڧྗͳ։ൃମ੍ʢby Google) • ϨΠςϯγͳΨϕʔδίϨΫγϣϯʢޙड़) • ๛ͳ։ൃ࣮(DockerͳͲ) • σϑΥϧτͰ੩తϦϯΫ͞ΕͨγϯάϧόΠφϦΛੜ
• πʔϧ։ൃͳͲʹ͘ • σϓϩΠ͕؆୯
αϒϛϦඵGC ग़యɿhttps://twitter.com/brianhatfield/status/804355831080751104
ऑΈ • ϝϞϦΛେྔʹ֬อɾղ์͢ΔΑ͏ͳ͍ํΛ͢Δͱεϧʔϓοτ͕ѱԽ • Պֶٕज़ܭࢉ༻ͷϥΠϒϥϦ͕গͳ͍ʢগͣͭ͠૿͖͑ͯͨɺޙͰհʣ • ԋࢉࢠΦʔόʔϩʔυ͕ͳ͍ʢˢʹͪΐͬͱӨڹʣ • όΠφϦαΠζ͕େ͖͘ͳΓ͕ͪ
GoͰROSϓϩάϥϛϯάͰ͖ΔΑ͏ʹ͠Α͏
rosgo ॳظ։ൃ൛(2013) • ͕ΜΓϙΠϯτ • XMLRPCϥΠϒϥϦ͕ͳ͔ͬͨͷͰࣗͰ࣮ͨ͠ • CatkinπʔϧνΣʔϯʹ౷߹
࠷ۙͷΞοϓσʔτ(2018) • RemappingΛ࣮ • ΫϥΠΞϯτϥΠϒϥϦͷػೳ͕Ұ௨ΓͦΖͬͨ • v1.0.0ͷ४උ͕ͬͨʁ • ಠཱͨ͠msg/srvίʔυδΣωϨʔλΛ࣮ •
Good bye, Catkin and CMake! • GoͷίʔυδΣωϨʔλΛ࣮ͯ͠ Pure Go ύοέʔδԽ • Go generateͱvendoringΛར༻ʢޙड़ʣ
ϝοηʔδੜ • Goͷػೳ go generate (v1.4+)ɹͱ vendorng (v1.5+)Λ׆༻ • ιʔείʔυதʹҎԼͷΑ͏ʹॻ͍͓ͯ͘
• //go:generate gengo msg your_pkg/MsgType • $ go generate <GO_PKG_NAME> Λ࣮ߦ • ͢Δͱɺ$GOPATH/your_pkg/vendorҎԼʹGoίʔυ͕ੜ
rosgo ίʔυྫ
Πϯετʔϧ 1. GoͷΠϯετʔϧ 2. $ go get -u github.com/akio/rosgo/ros 3.
$ go install github.com/akio/rosgo/gengo 4. import “github.com/akio/rosgo/ros"
Publisher package main //go:generate gengo msg std_msgs/String import ( "fmt"
"github.com/akio/rosgo/ros" "os" "std_msgs" "time" ) func main() { node, _ := ros.NewNode("/talker", os.Args) defer node.Shutdown() pub, _ := node.NewPublisher("/chatter", std_msgs.MsgString) for node.OK() { node.SpinOnce() var msg std_msgs.String msg.Data = fmt.Sprintf("hello %s", time.Now().String()) pub.Publish(&msg) time.Sleep(time.Second) } }
Subscriber package main //go:generate gengo msg std_msgs/String import ( "fmt"
"github.com/akio/rosgo/ros" "os" "std_msgs" ) func callback(msg *std_msgs.String) { fmt.Printf("Received: %s\n", msg.Data) } func main() { node, _ := ros.NewNode("/listener", os.Args) defer node.Shutdown() node.NewSubscriber("/chatter", std_msgs.MsgString, callback) node.Spin() }
Example: Service Server package main //go:generate gengo srv rospy_tutorials/AddTwoInts import
( "fmt" "github.com/akio/rosgo/ros" "os" "rospy_tutorials" ) func callback(srv *rospy_tutorials.AddTwoInts) error { srv.Response.Sum = srv.Request.A + srv.Request.B fmt.Printf("%d + %d = %d\n", srv.Request.A, srv.Request.B, srv.Response.Sum) return nil } func main() { node, _ := ros.NewNode("server", os.Args) defer node.Shutdown() server, _ := node.NewServiceServer("/add_two_ints", rospy_tutorials.SrvAddTwoInts, callback) defer server.Shutdown() node.Spin() }
Service Client package main //go:generate gengo srv rospy_tutorials/AddTwoInts import (
"fmt" "github.com/akio/rosgo/ros" "os" "rospy_tutorials" ) func main() { node, _ := ros.NewNode("client", os.Args) defer node.Shutdown() cli, _ := node.NewServiceClient("/add_two_ints", rospy_tutorials.SrvAddTwoInts) defer cli.Shutdown() var srv rospy_tutorials.AddTwoInts srv.Request.A = 1 srv.Request.B = 2 _ = cli.Call(&srv) fmt.Printf("%d + %d = %d\n", srv.Request.A, srv.Request.B, srv.Response.Sum) }
Parameters package main import ( "fmt" "github.com/akio/rosgo/ros" "log" "os" )
func main() { node, _ := ros.NewNode("/test_param", os.Args) defer node.Shutdown() hasParam, _ := node.HasParam("/rosdistro") param, _ := node.GetParam("/rosdistro") err := node.SetParam("/test_param", 42) param, _ := node.GetParam("/test_param") err := node.DeleteParam("/test_param") foundKey, _ := node.SearchParam(“/rosdistro") }
͜Ε͔Β
ػೳՃ • Action Client/Server • TF • ଞʁ
ϩϘοτ։ൃʹ͑ΔGoϥΠϒϥϦͷհ • GoCV • OpenCVͷGoόΠϯσΟϯά • Tensorflow • ެࣜͷGoόΠϯσΟϯά͕ ͋Δ
• GoNum • NumpyతͳܭࢉϥΠϒϥ Ϧ • gobot • ओʹIoTͳ֎෦σόΠεͱͷI/Oॲཧϥ ΠϒϥϦ • g3n • ήʔϜΤϯδϯɺՄࢹԽͳͲʹ͑Δ • GoRO • ৭ʑΓͳ͍ͷͰࣗͰ࡞Γ࢝Ίͨ • https://github.com/akio/goro • ·ͩURDF parser ͘Β͍͔͠ͳ͍
Go 2 • GoݴޠͷΧϯϑΝϨϯε GopherCon2018ʹͯɺGo 2ͷυϥϑτ͕ൃද • Τϥʔॲཧจ๏ͷվྑ • δΣωϦΫεͷՃ
ROS2 • DDSΛ࣮͢Δͷେมͦ͏ • rclΛcgoͰϥοϓ͢Δʁ
·ͱΊ • GoݴޠͰ͑ΔROSΫϥΠΞϯτϥΠϒϥϦΛ։ൃͨ͠ • ฏ͕ऴΘΔલʹൃදͰ͖ͯྑ͔ͬͨ
Thank you! https://github.com/akio/rosgo.git