open robotics

52

Upload: others

Post on 28-Apr-2022

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Open Robotics
Page 2: Open Robotics
Page 4: Open Robotics
Page 5: Open Robotics

○○○○

Longest distance a ROS robot has traveled from Earth: 270 miles

Page 6: Open Robotics
Page 7: Open Robotics

geometry_msgs::Twist::Ptr msg = boost::make_shared<...>();...pub->publish(msg);

Page 8: Open Robotics

Messagegeometry_msgs/TwistVector3 linearVector3 angular

geometry_msgs::Twist::Ptr msg = boost::make_shared<...>();...pub->publish(msg);

/cmd_vel

Page 9: Open Robotics

Messagegeometry_msgs/TwistVector3 linearVector3 angular

geometry_msgs::Twist::Ptr msg = boost::make_shared<...>();...pub->publish(msg);

TCPROS

TCP

IP

/cmd_vel

Page 10: Open Robotics

Messagegeometry_msgs/TwistVector3 linearVector3 angular

geometry_msgs::Twist::Ptr msg = boost::make_shared<...>();...pub->publish(msg);

TCPROS

TCP

IP

TCPROS

TCP

IP

/cmd_vel /cmd_vel

Page 11: Open Robotics

Messagegeometry_msgs/TwistVector3 linearVector3 angular

geometry_msgs::Twist::Ptr msg = boost::make_shared<...>();...pub->publish(msg);

TCPROS

TCP

IP

TCPROS

TCP

IP

/cmd_vel

Messagegeometry_msgs/TwistVector3 linearVector3 angular

/cmd_vel

ROS callback

Motor drivers

Page 12: Open Robotics

Messagegeometry_msgs/TwistVector3 linearVector3 angular

geometry_msgs::Twist::Ptr msg = boost::make_shared<...>();...pub->publish(msg);

TCPROS

TCP

IP

TCPROS

TCP

IP

/cmd_vel

Messagegeometry_msgs/TwistVector3 linearVector3 angular

/cmd_vel

ROS callback

Motor drivers

Page 13: Open Robotics
Page 14: Open Robotics
Page 15: Open Robotics

void chatterCallback(const std_msgs::String::ConstSharedPtr msg){ printf("I heard: [%s]", msg->data);}

int main(int argc, char *argv[]){ rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("listener");

auto sub = node->create_subscription <std_msgs::String>("chatter", 7, chatterCallback);

rclcpp::SingleThreadedExecutor executor; executor.add_node(node); executor.spin();

return 0;}

void chatterCallback(const std_msgs::String::ConstPtr msg){ printf("I heard: [%s]", msg->data);}

int main(int argc, char *argv[]){ ros::init(argc, argv, “listener”); ros::NodeHandle n;

ros::Subscriber sub = n.subscribe( "chatter", 7, chatterCallback);

ros::spin();

return 0;}

Page 16: Open Robotics

void chatterCallback(const std_msgs::String::ConstSharedPtr msg){ printf("I heard: [%s]", msg->data);}

int main(int argc, char *argv[]){ rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("listener");

auto sub = node->create_subscription <std_msgs::String>("chatter", 7, chatterCallback);

rclcpp::SingleThreadedExecutor executor; executor.add_node(node); executor.spin();

return 0;}

void chatterCallback(conststd_msgs::String::ConstPtr msg){ printf("I heard: [%s]", msg->data);}

int main(int argc, char *argv[]){ ros::init(argc, argv, “listener”); ros::NodeHandle n;

ros::Subscriber sub = n.subscribe( "chatter", 7, chatterCallback);

ros::spin();

return 0;}

Page 17: Open Robotics

void chatterCallback(const std_msgs::String::ConstSharedPtr msg){ printf("I heard: [%s]", msg->data);}

int main(int argc, char *argv[]){ rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("listener");

auto sub = node->create_subscription <std_msgs::String>("chatter", 7, chatterCallback);

rclcpp::SingleThreadedExecutor executor; executor.add_node(node); executor.spin();

return 0;}

void chatterCallback(const std_msgs::String::ConstPtr msg){ printf("I heard: [%s]", msg->data);}

int main(int argc, char *argv[]){ ros::init(argc, argv, “listener”); ros::NodeHandle n;

ros::Subscriber sub = n.subscribe( "chatter", 7, chatterCallback);

ros::spin();

return 0;}

Page 18: Open Robotics

void chatterCallback(const std_msgs::String::ConstSharedPtr msg){ printf("I heard: [%s]", msg->data);}

int main(int argc, char *argv[]){ rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("listener");

auto sub = node->create_subscription <std_msgs::String>("chatter", 7, chatterCallback);

rclcpp::SingleThreadedExecutor executor; executor.add_node(node); executor.spin();

return 0;}

void chatterCallback(const std_msgs::String::ConstPtr msg){ printf("I heard: [%s]", msg->data);}

int main(int argc, char *argv[]){ ros::init(argc, argv, “listener”); ros::NodeHandle n;

ros::Subscriber sub = n.subscribe( "chatter", 7, chatterCallback);

ros::spin();

return 0;}

Page 19: Open Robotics

void chatterCallback(const std_msgs::String::ConstSharedPtr msg){ printf("I heard: [%s]", msg->data);}

int main(int argc, char *argv[]){ rclcpp::init(argc, argv); auto node = rclcpp::Node::make_shared("listener");

auto sub = node->create_subscription <std_msgs::String>("chatter", 7, chatterCallback);

rclcpp::SingleThreadedExecutor executor; executor.add_node(node); executor.spin();

return 0;}

void chatterCallback(const std_msgs::String::ConstPtr msg){ printf("I heard: [%s]", msg->data);}

int main(int argc, char *argv[]){ ros::init(argc, argv, “listener”); ros::NodeHandle n;

ros::Subscriber sub = n.subscribe( "chatter", 7, chatterCallback);

ros::spin();

return 0;}

Page 20: Open Robotics

user_code.cpp

rclcpp

OpenSplice

ROS Middleware C API

Connext etc...

user_code.c user_code.py

rclpyrclcROS Client Libraries

DDS Implementations

Page 21: Open Robotics

Why do we care?

Page 22: Open Robotics

user_code.cpp

rclcpp

OpenSplice

ROS Middleware C API

Connext etc...

user_code.c user_code.py

rclpyrclc

All layers of the stack must be real-time safe!

Page 23: Open Robotics

ExecutorInitialization: Preallocate memory

Cleanup: Deallocate memory

spin()

Do work if it came in

Loop until interrupted

rmw_wait(timeout)

Executor::spin

Page 24: Open Robotics

Executor

void spin(...) { // New subscription arrives void * subscription_handle = memory_strategy->borrow_handle( sizeof(Subscription));

... // Don’t need handle anymore memory_strategy->return_handle( subscription_handle);}

HeapPoolMemoryStrategy

void * borrow_handle(size_t s) { // reserve s bytes return mem_pool[seq];}void return_handle( void * ptr) { // get space reserved by ptr and set to null}

DynamicMemoryStrategy

void * borrow_handle(size_t s) { return malloc(s);}void return_handle(void * ptr) { free(ptr);}

Select at runtime

Page 25: Open Robotics

RT_PREEMPT kernel (“soft real-time”)POSIX threads with SCHED_RR

malloc_hook : count malloc callsgetrusage : count pagefaults

Goal:1 kHz update loop (1 ms period)Less than 3% jitter (30 microseconds)

Non-RT process Non-RT process

sensor data

motor command

Controller Simulator

Logger Teleop

profiling results user command

Page 26: Open Robotics

Ran for 165 minutes

Conclusion:Off to a decent start

Nanoseconds % of update rate

Minimum 1620 0.162%

Maximum 35094 3.51%

Mean 4567.1 0.457%

Page 27: Open Robotics

○○

○ std::vector○ std::map○ std::basic_string○

Page 28: Open Robotics

Page 29: Open Robotics

template<typename ServiceT>create_service( const std::string & service_name, std::function<void(ServiceT::Request, ServiceT::Response)> callback); template<typename ServiceT>create_service( const std::string & service_name, std::function<void(rmw_request_id_t, ServiceT::Request, ServiceT::Response)> callback);

Calling the function compiles on OSX and Linux but not VS2015:call is ambiguous.

node->create_servi ce("foo", [](AddIntsService::Request, AddIntsService::Response) { ... }); ???

Page 30: Open Robotics

template<typename ServiceT, FunctorT, typename std::enable_if< std::is_same< typename function_traits<FunctorT>:: template argument_type<2>, typename std::shared_ptr< typename ServiceT::Response> >::value>::type * = nullptr>typename Service<ServiceT>::SharedPtr create_service(..., FunctorT callback){ ... }

Translation: ServiceT::Response

???

Page 31: Open Robotics

static_assert( std::is_same< typename function_traits<FunctorT>:: template argument_type<2>, typename std::shared_ptr< typename ServiceT::Response> >::value, "Third argument must be of type std::shared_ptr<ServiceT::Response>"); ???

Page 32: Open Robotics

Now you have everything you need to program robots, right?

Page 33: Open Robotics

What about a several thousand dollar robot?

Page 34: Open Robotics

On second thought... how about a free simulation?

Page 35: Open Robotics

http://gazebosim.org/

Page 38: Open Robotics
Page 39: Open Robotics
Page 40: Open Robotics
Page 41: Open Robotics
Page 42: Open Robotics
Page 43: Open Robotics
Page 44: Open Robotics
Page 46: Open Robotics
Page 47: Open Robotics
Page 48: Open Robotics
Page 49: Open Robotics
Page 50: Open Robotics
Page 51: Open Robotics