Slide 1

Slide 1 text

GoݴޠʹΑΔROSϓϩάϥϛϯά https://github.com/akio/rosgo.git

Slide 2

Slide 2 text

ࣗݾ঺հ

Slide 3

Slide 3 text

ࣗݾ঺հ • Akiyoshi(Akio) Ochiai • Sr Engineer @ Toyota Research Institute • ϞόΠϧϚχϐϡϨʔγϣϯϩϘοτͷݚڀ։ൃʹैࣄ • GitHub: http://github.com/akio • ࠓ೔͸ݸਓతͳOSS׆ಈͷ࿩Λ͠·͢

Slide 4

Slide 4 text

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ͳͲ

Slide 5

Slide 5 text

ެ։ROS͓࢓ࣄ • ։ൃνʔϜͷڠྗͷ΋ͱɺτϤλHSRͷϩϘοτϞσϧϑΝΠϧΛΦʔϓϯιʔεԽ͠·ͨ͠ • hsr_description • https://github.com/ToyotaResearchInstitute/hsr_description • hsr_meshes • https://github.com/ToyotaResearchInstitute/hsr_meshes https://github.com/OTL/gear ROSҎ֎Ͱͷ׆༻ྫ

Slide 6

Slide 6 text

Why Go?

Slide 7

Slide 7 text

ಈػ • 2013౰࣌ɺROS։ൃਓࡐͷҭ੒ʹ೰ΜͰ͍ͨ • C++ • ෳࡶͳݴޠ࢓༷ • Python/MatlabͳͲ͔Βདྷͨਓͷϋʔυϧ͕ߴ͍ • Cݴޠܦݧऀ͕৽֓೦ΛֶͿͷ΋೉͍͠ʢOOPɺδΣωϦοΫϓϩάϥϛϯά౳ʣ • Python • ֶशίετ௿͍ • ੑೳ͕ඞཁʹͳΔͱ݁ہC/C++/CythonͳͲΛॻ͔͟Δ͑ͳ͘ͳͬͨΓ͢Δ

Slide 8

Slide 8 text

֮͑΍͍͢ ͦͦ͜͜଎͍ ͋Δఔ౓ϦΞϧλΠϜੑͷ͋Δ ϓϩάϥϛϯάݴޠ͸ͳ͍͔ʁ

Slide 9

Slide 9 text

̎̌̍̏౰࣌ͷީิൺֱ • Java • rosjava͕͢Ͱʹଘࡏ • ωΠςΟϒίϯύΠϧͰ͖ͳ͍ • ύοέʔδ഑෍͕ͭΒ͍ • Go • Better C తͳจ๏ • ػೳ͕ߜΒΕ֮͑Δ͜ͱ͕গͳ͍ • ωΠςΟϒίϯύΠϧͰ݁ߏ଎͍ • GC͕ϝϞϦͷੈ࿩Λͯ͘͠ΕΔ • Rust • ଎͍ɺ҆શɺؾ͍͍࣋ͪ • ࣗ෼͕ٻΊ͍ͯͨ΋ͷ͕େମ͋Δ • ͋Γ͗ͯ͢΍ͬͺΓֶशίετ͕ߴ ͍ͷͰ͸‥.ʁ • Julia • ॻ͖΍ͯ͘͢଎ͯ͘࠷ڧʹݟ͑Δ • Ͱ΋౰࣌Ͱ͖ͨ͹͔ΓͰ৭ʑػೳ͕ ଍Γͳ͔ͬͨ • ฒྻॲཧ͕ͭΒͦ͏

Slide 10

Slide 10 text

ͦͷଞͷڧΈ • ڧྗͳ։ൃମ੍ʢby Google) • ௿ϨΠςϯγͳΨϕʔδίϨΫγϣϯʢޙड़) • ๛෋ͳ։ൃ࣮੷(DockerͳͲ) • σϑΥϧτͰ੩తϦϯΫ͞ΕͨγϯάϧόΠφϦΛੜ੒ • πʔϧ։ൃͳͲʹ޲͘ • σϓϩΠ͕؆୯

Slide 11

Slide 11 text

αϒϛϦඵGC ग़యɿhttps://twitter.com/brianhatfield/status/804355831080751104

Slide 12

Slide 12 text

ऑΈ • ϝϞϦΛେྔʹ֬อɾղ์͢ΔΑ͏ͳ࢖͍ํΛ͢Δͱεϧʔϓοτ͕ѱԽ • Պֶٕज़ܭࢉ༻ͷϥΠϒϥϦ͕গͳ͍ʢগͣͭ͠૿͖͑ͯͨɺޙͰ঺հʣ • ԋࢉࢠΦʔόʔϩʔυ͕ͳ͍ʢˢʹͪΐͬͱӨڹʣ • όΠφϦαΠζ͕େ͖͘ͳΓ͕ͪ

Slide 13

Slide 13 text

GoͰROSϓϩάϥϛϯάͰ͖ΔΑ͏ʹ͠Α͏

Slide 14

Slide 14 text

rosgo ॳظ։ൃ൛(2013) • ͕Μ͹ΓϙΠϯτ • XMLRPCϥΠϒϥϦ͕ͳ͔ͬͨͷͰࣗ෼Ͱ࣮૷ͨ͠ • CatkinπʔϧνΣʔϯʹ౷߹

Slide 15

Slide 15 text

࠷ۙͷΞοϓσʔτ(2018) • RemappingΛ࣮૷ • ΫϥΠΞϯτϥΠϒϥϦͷػೳ͕Ұ௨ΓͦΖͬͨ • v1.0.0ͷ४උ͕੔ͬͨʁ • ಠཱͨ͠msg/srvίʔυδΣωϨʔλΛ࣮૷ • Good bye, Catkin and CMake! • Go੡ͷίʔυδΣωϨʔλΛ࣮૷ͯ͠ Pure Go ύοέʔδԽ • Go generateͱvendoringΛར༻ʢޙड़ʣ

Slide 16

Slide 16 text

ϝοηʔδੜ੒ • Goͷػೳ go generate (v1.4+)ɹͱ vendorng (v1.5+)Λ׆༻ • ιʔείʔυதʹҎԼͷΑ͏ʹॻ͍͓ͯ͘ • //go:generate gengo msg your_pkg/MsgType • $ go generate Λ࣮ߦ • ͢Δͱɺ$GOPATH/your_pkg/vendorҎԼʹGoίʔυ͕ੜ੒

Slide 17

Slide 17 text

rosgo ίʔυྫ

Slide 18

Slide 18 text

Πϯετʔϧ 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"

Slide 19

Slide 19 text

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) } }

Slide 20

Slide 20 text

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() }

Slide 21

Slide 21 text

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() }

Slide 22

Slide 22 text

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) }

Slide 23

Slide 23 text

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") }

Slide 24

Slide 24 text

͜Ε͔Β

Slide 25

Slide 25 text

ػೳ௥Ճ • Action Client/Server • TF • ଞʁ

Slide 26

Slide 26 text

ϩϘοτ։ൃʹ࢖͑ΔGoϥΠϒϥϦͷ঺հ • GoCV • OpenCVͷGoόΠϯσΟϯά • Tensorflow • ެࣜͷGoόΠϯσΟϯά͕ ͋Δ • GoNum • Numpyతͳ਺஋ܭࢉϥΠϒϥ Ϧ • gobot • ओʹIoTͳ֎෦σόΠεͱͷI/Oॲཧϥ ΠϒϥϦ • g3n • ήʔϜΤϯδϯɺՄࢹԽͳͲʹ࢖͑Δ • GoRO • ৭ʑ଍Γͳ͍ͷͰࣗ෼Ͱ࡞Γ࢝Ίͨ • https://github.com/akio/goro • ·ͩURDF parser ͘Β͍͔͠ͳ͍

Slide 27

Slide 27 text

Go 2 • GoݴޠͷΧϯϑΝϨϯε GopherCon2018ʹͯɺGo 2ͷυϥϑτ͕ൃද • Τϥʔॲཧจ๏ͷվྑ • δΣωϦΫεͷ௥Ճ

Slide 28

Slide 28 text

ROS2 • DDSΛ࣮૷͢Δͷ͸େมͦ͏ • rclΛcgoͰϥοϓ͢Δʁ

Slide 29

Slide 29 text

·ͱΊ • GoݴޠͰ࢖͑ΔROSΫϥΠΞϯτϥΠϒϥϦΛ։ൃͨ͠ • ฏ੒͕ऴΘΔલʹൃදͰ͖ͯྑ͔ͬͨ

Slide 30

Slide 30 text

Thank you! https://github.com/akio/rosgo.git